当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪C#Json数据反序列化为Dictionary并根据关键字获取指定的值      Json数据:{ "dataSet": { "header": { "returnCode": "0", "errorInfo": "HTTP请求错误", "version": "V1.0R010", "totalRows": "2000", "returnRows": "20" }, "fieldDefine": { "assetId": "string", "serv.........
    ▪把Task, Lazy<T>和INotifyPropertyChanged组装成一个超级属性      这三个元素,Task代表着异步多线程,Lazy<T>代表着延迟初始化,INotifyPropertyChanged则代表着属性改变通知(多用于MVVM模式中)。那么如果把这三个元素组合起来就是一个异步延迟初始化的IN.........
    ▪好久没写东西了,发一个泛型的搜索,排序的库       1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace xxWare.Common 8 { 9 public static class GenericExtension 10 { 11 #region List<T> se.........

[1]C#Json数据反序列化为Dictionary并根据关键字获取指定的值
    来源:    发布时间: 2013-10-28

Json数据:

{
"dataSet": {
"header": {
"returnCode": "0",
"errorInfo": "HTTP请求错误",
"version": "V1.0R010",
"totalRows": "2000",
"returnRows": "20"
},
"fieldDefine": {
"assetId": "string",
"serverIdcId": "int",
"inputTime": "datetime"
},
"data": {
"row": [
{
"AssetId": "TCNS2006888",
"ServerIdcId": "1",
"InputTime": "2008-12-12"
},
{
"AssetId": "TCNS2006889",
"ServerIdcId": "2",
"InputTime": "2008-1-1"
}
]
}
}
}

问题:如何获取header中的数据行,以便显示在界面上?                                                             

效果图:                                                     

 

将json数据转成dictionary的代码:                                         

/// <summary>
/// 将json数据反序列化为Dictionary
/// </summary>
/// <param name="jsonData">json数据</param>
/// <returns></returns>
private Dictionary<string, object> JsonToDictionary(string jsonData)
{
//实例化JavaScriptSerializer类的新实例
JavaScriptSerializer jss = new JavaScriptSerializer();
try
{
//将指定的 JSON 字符串转换为 Dictionary<string, object> 类型的对象
return jss.Deserialize<Dictionary<string, object>>(jsonData);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

 

使用方法:                                                 

private void button1_Click(object sender, EventArgs e)
{
//
    
[2]把Task, Lazy<T>和INotifyPropertyChanged组装成一个超级属性
    来源:    发布时间: 2013-10-28

这三个元素,Task代表着异步多线程,Lazy<T>代表着延迟初始化,INotifyPropertyChanged则代表着属性改变通知(多用于MVVM模式中)。那么如果把这三个元素组合起来就是一个异步延迟初始化的INotifyPropertyChanged属性。

 

实现起来是这样,因为Task和Lazy<T>只针对方法,而INotifyPropertyChanged只针对属性。所以异步延迟初始化的INotifyPropertyChanged属性还需要一个属性的初始化值,整个过程很简单。当第一次尝试获取属性值之后,初始值会被立刻返回,接着Task运行,注意此时无论多少个线程同时获取属性值,只有一个Task会运行(这是Lazy<T>的功劳),最终等这个Task运行结束后,属性值改变,通过INotifyPropertyChanged接口的执行来反馈给需要属性地方(比如界面上的数据绑定)。

 

这里我先对其他两两组合的情况讨论一下,当然相比把这三个一起组合起来,两两组合实现起来更简单些:

Task Lazy<T> 可以参考.NET Parallel Programming博客中的AsyncLazy<T>实现。 INotifyPropertyChanged Task 和没有TPL时的原始多线程操作一样,只不过需要注意操作结束后要在当前SynchronizationContext中执行属性的设置操作(因为属性改变会诱发UI改变,而UI改变必须在UI线程内)。
这里推荐用C# 5.0的async/await。 Lazy<T> INotifyPropertyChanged 没有太大意义,因为Lazy<T>的值是不可改变的。如果界面绑定的话,直接绑定Lazy<T>的Value属性。

 

下面讲我们这个三个组合的,运行示例程序可以看到,起初界面绑定的都是初始值(此时背后的Task已经开始运行),同时整个属性还提供是否加载完毕和有错误的信息(这些属性也是INotifyPropertyChanged执行的),在最下方有两个按钮又绑定了同样的属性值,但实际上异步延迟初始化只进行一次:

几秒后,Task运行完毕,界面发生了变化,属性1返回结果,属性2抛出异常,界面上会显示异常信息同时属性2的值保持初始值:

整个过程界面都是响应的,也就是说操作是异步的。

 

属性的类型名称是AsyncProperty,是在AsyncLazy<T>的基础上,加入了初始值和INotifyPropertyChanged的支持:

 

不过AsyncProperty<T>没有像AsyncLazy<T>那样以Lazy<Task<T>>为父类,而是把Lazy<Task<T>>作为一个字段,这样在初始化时更好被处理。用户可以通过Func<T>或者返回Task的Func<Task<T>>来初始化AsyncProperty类型。

AsyncValue属性是AsyncProperty的值,当第一次获取AsyncValue属性,它会立刻返回初始值,接着运行背后Task,当Task结束后,AsyncValue的属性会再次改变。

Error属性是错误信息,当Task中的代码发生异常后,Error会返回异常也就是Exception的Message属性。

HasValue和HasError代表是否又值和是否有错误。当HasError为True后HasValue也会是True,这里HasValue有点像是否完成初始化的意思。

(上述属性全是执行INotifyPropertyChanged接口)

 

AsyncProperty的使用就是这样很简单,那么示例程序中的ViewModel就是这样初始化AsyncProperty的:

public class ViewModel

{

    public AsyncProperty<string> Data1 { get; private set; }

    public AsyncProperty<int> Data2 { get; private set; }

 

    public ViewModel()

    {

        //注意是返回Task的委托,而不是直接运行的Task

        var task1 = new Func<Task<string>>(() => Task.Run(() =>

            {

                Task.Delay(3000).Wait();

                return "Mgen";

            }));

        var task2 = new Func<Task<int>>(() => Task.Run(()

    
[3]好久没写东西了,发一个泛型的搜索,排序的库
    来源:    发布时间: 2013-10-28
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6
7 namespace xxWare.Common
8 {
9 public static class GenericExtension
10 {
11 #region List<T> search count
12 public static int CountAll<T>(this List<T> _list, T _searchobj)
13 {
14 return (from t in _list where t.Equals(_searchobj) select t).Count();
15 }
16
17 //Must be Sort before use BinarySearchCountAll
18 public static int BinarySearchCountAll<T>(this List<T> _list, T _searchobj)
19 {
20 int center = _list.BinarySearch(_searchobj);
21
22 if (center >= 0)
23 {
24 int left = center;
25
26 while (left > 0 && _list[left - 1].Equals(_searchobj))
27 {
28 left -= 1;
29 }
30
31 int right = center;
32 while (right < (_list.Count - 1) && _list[right + 1].Equals(_searchobj))
33 {
34 right += 1;
35 }
36
37 return (right - left) + 1;
38 }
39 else
40 {
41 return center;
42 }
43 }
44
45 public static List<T> FindAll<T>(this List<T> _list, T _searchobj)
46 {
47 List<T> _founditem = new List<T>();
48
49 foreach (var v in _list)
50 {
51 if (v.Equals(_searchobj))
52 {
53 _founditem.Add(v);
54 }
55 }
56
57 return _founditem;
58 }
59
60 //Must be Sort before use BinarySearchAll
61 public static List<T> BinarySearchAll<T>(this List<T> _list, T _searchobj)
62 {
63 List<T> _retobj = new List<T>();
64
65 int center = _list.BinarySearch(_searchobj);
66
67 if (center >= 0)
68 {
69 _retobj.Add(_list[center]);
70
71 int left = center;
72
73 while (left > 0 && _list[left - 1].Equals(_searchobj))
74 {
75
    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3