C# C将列表转换为字典LINQ
我有一个JSON字符串[],如下所示: ['518','日期不正确今天不能早一点或今天晚一点+1年'] 我使用Json.Net库将其反序列化为一个列表,现在我需要将该列表字符串转换为一个字典,其中键是列表中的第一个值,值是列表中的第二个项,如下所示 我已经使用类似这样的for循环完成了这项工作:C# C将列表转换为字典LINQ,c#,json,linq,serialization,C#,Json,Linq,Serialization,我有一个JSON字符串[],如下所示: ['518','日期不正确今天不能早一点或今天晚一点+1年'] 我使用Json.Net库将其反序列化为一个列表,现在我需要将该列表字符串转换为一个字典,其中键是列表中的第一个值,值是列表中的第二个项,如下所示 我已经使用类似这样的for循环完成了这项工作: string Json = "['518','Incorrect CheckIn date (it can not be earlier today or later today+1year)']";
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循环
谢谢。其中一个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并具有AddRange方法:
或者,您也可以通过pairs.ToList获得结果列表。您可以这样尝试:
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);
}
谢谢你的快速回答,它们都是我想要的。
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);
}