【问题标题】:Build dictionary from array using Linq使用 Linq 从数组构建字典
【发布时间】:2017-08-30 14:28:19
【问题描述】:

我有一个 A 类,其中包含 B 类描述的键/值对数组。其中一个键称为“名称”。我想使用 Linq 构建一个Dictionary<string, Dictionary<string, string>>,其中第一个字典的键是 B 数组中名为“名称”的属性,值是包含 B 的键/值对的第二个字典。

public class A
{
    public int a;
    public B[] b;
}

public class B
{
    public string key;
    public string value;
}

A[] a = new A[]
{
    new A { a = 1, b = new B[] { new B { key = "name", value = "n1"}, new B { key = "test", value = "t1" } }, },
    new A { a = 2, b = new B[] { new B { key = "name", value = "n2"}, new B { key = "test", value = "t2" } }, },
};    

所以实际上我想在数组“a”上使用 Linq 构建以下字典:

Dictionary<string, Dictionary<string, string>> d = new Dictionary<string, Dictionary<string, string>>()
{
    { "n1",  new Dictionary<string, string>() { { "name", "n1" }, { "test", "t1" } } },
    { "n2",  new Dictionary<string, string>() { { "name", "n2" }, { "test", "t2" } } },
};

【问题讨论】:

    标签: c# .net arrays linq dictionary


    【解决方案1】:

    应该是:

    var dict = a.ToDictionary(
        x => x.b[0].value, 
        y => y.b.ToDictionary(z => z.key, z => z.value)
    );
    

    这个 LINQ 表达式唯一“有趣”的部分是我必须使用最多 z 参数(xyz)...我花了三个编译才把它弄好(我总是将参数命名为x

    修改意见:

    var dict = a.ToDictionary(
        x => x.b.First(y => y.key == "name").value, 
        y => y.b.ToDictionary(z => z.key, z => z.value)
    );
    

    【讨论】:

    • 酷!参数“name”可以随机放置在数组中(不一定是第一个元素)。我该如何修改表达式以应对这种情况?
    • @user957479 更新
    • 谢谢,当您看到结果时,它看起来总是那么简单;-)
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多