我有一个JSON字符串[]像这样:['518','日期不正确(不可能是今天早些时候或今天晚些时候+1年)']"我用Json反序列化。Net库转换为List,现在我需要将该列表字符串转换为Dictionary,其中键是第一个值,值是列表中的第二个项,如下所示。
我已经使用了这样的for循环:
string Json = "['518','Incorrect CheckIn date (it can not be earlier today or later today+1year)']";
var json = Newtonsoft.Json.JsonConvert.DeserializeObject<string[]>(Json);
var errorList = new ErrorList();
for(int i=1;i<= json.Length;i++)
{
errorList.ErrorMessages.Add(new ErrorMessage(){ErrorCode = json[i -1], Message = json[i]});
i = i + 1;
}
我想知道是否有一种方法可以用linq代替fro循环。
谢谢。
您可以这样尝试:
string Json = "['1','value1','2','value2','3','value3']";
var json = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(Json);
var result = json.Select((v, i) => new {value = v, index = i})
.Where(o => o.index%2 == 0)
.ToDictionary(o => o.value, o => json[o.index + 1]);
foreach (var pair in result)
{
Console.WriteLine("key: {0}, value: {1}", pair.Key, pair.Value);
}
其中一个Select
扩展将为您提供枚举中项的索引。通过一些操作,您可以将字符串组合成对,如下所示:
var pairs =
from item in json.Select((s, i) => new { index = i, value = s })
// group by index / 2 to get pairs of values
group item.value by item.index / 2 into grp
// create ErrorMessage instances from the value pairs
select new ErrorMessage { ErrorCode = grp.First(), Message = grp.Last() };
或者如果你喜欢流畅的语法:
var pairs =
json.Select((s,i) => new { s, i })
.GroupBy(e => e.i / 2, e => e.s)
.Select(g => new ErrorMessage{ ErrorCode = g.First(), Message = g.Last() });
假设您的ErrorList
类型派生自List<ErrorMessage>
并具有AddRange
方法:
errorList.AddRange(pairs);
或者您可以直接执行pairs.ToList()
以获得List<ErrorMessage>
的结果。