C# 将列表<string>转换为字典<字符串、字符串> LINQ



我有一个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>的结果。

最新更新