C# C将列表转换为字典LINQ

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)']";

我有一个JSON字符串[],如下所示: ['518','日期不正确今天不能早一点或今天晚一点+1年'] 我使用Json.Net库将其反序列化为一个列表,现在我需要将该列表字符串转换为一个字典,其中键是列表中的第一个值,值是列表中的第二个项,如下所示

我已经使用类似这样的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循环

谢谢。

其中一个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);
}