使用Linq从包含列表的列表生成列表

时间:2018-03-29 11:27:17

标签: c# linq

我在格式化这个问题的标题时遇到了困难。但我认为一个例子会让事情变得更清楚。

我有以下列表,其中包含可变数量的其他列表,其中包含可变数量的'a'对象。

[
    [ a, a, a, a],
    [ a, a, a],
    [ a, a, a],
    [ a, a, a, a],
    [ a, a, a],
    [ a, a, a, a],
    [ a, a, a]
]

其中'a'表示类的实例:

class a {
    public int Number { get; set; }
    public SomeClass SomeClass { get; set; }
}

基本上我想要的是在SomeClass等于1时创建Number个对象的列表。

我已经使用foreach循环实现了这一点,但我想使用Linq来实现这一目标。

使用foreach循环的伪代码:

List<SomeObject> someObjectsList = new List<SomeObject>();

// list is the list which contains lists of 'a' objects described above in the question
foreach (var listOfAObjects in list)
{
    var listThatCompliesWithWhereClause = listOfAObjects.Where(x => x.Number == 1);

    foreach (var a in listThatCompliesWithWhereClause)
    {
        someObjectsList.Add(a.SomeObject);
    }
}

// someObjectsList is now filled with what I need

我怎么能用Linq解决这个问题?

此外,欢迎提出更好标题的建议。

2 个答案:

答案 0 :(得分:11)

尝试

list.SelectMany(it => it).Where(it => it.Number == 1).Select(it => it.SomeClass)

答案 1 :(得分:3)

您已经两次访问list,我认为这是一个错字。

使用LINQ的方法的完全等价如下:

var resultSet  = 
    list.SelectMany(listOfAObjects => listOfAObjects.Where(x => x.Volgnummer == 1))
        .Select(a => a.SomeObject)
        .ToList();

这会使用SelectMany将所有嵌套IEnumerable<IEnumerable<T>>折叠为IEnumerable<T>,其中TlistOfAObjects中包含的元素类型,然后我们将其投影到带有IEnumerable<R>子句的Select,最后我们将这些元素累积到List中。