Linq如何缩小班级/自我加入列表

时间:2017-05-20 10:54:11

标签: c# linq

我有以下课程的列表

class testdata {
    public string code { get; set; }
    public string[] values { get; set; }
}

如何执行连接,以便获得代码和值的列表,即值将重复每个代码,例如,如果列表中有两个项目,如

1."code1",{"value1","value2"}

2."code2",{"value1","value2","value3"}

我希望决赛的格式如

Code1,Value1

code1,Value2

Code2,value1

code3,value2

code3,value3

我想通过LINQ和匿名类实现它,我可以使用循环并根据最终结构创建一个类。

2 个答案:

答案 0 :(得分:2)

myList.SelectMany(td => td.values.Select(v => new { td.code, v } ))

SelectMany说"取许多IEnumerables并将它们的元素连接成一个IEnumerable"

td是列表中的单个元素。它是testdata

的单个实例

现在,您可以Select超过td.values来创建单独的匿名对象。 Select将返回一个IEnumerable,但包含在SelectMany内,IEnumerable<anonymous object>的许多实例将被展平为一个IEnumerable<anonymous object>

答案 1 :(得分:0)

试试这个

            List<TestData> testData = new List<TestData>() {
                new TestData() { code = "Code1", values = new string[] {"Value1","Value2"}},
                new TestData() { code = "Code2", values = new string[] {"value1"}},
                new TestData() { code = "code3", values = new string[] {"value2","value3"}}
            };

            var results = testData.Select(x => x.values.Select(y => new { code = x.code, value = y })).SelectMany(y => y).ToList();