【问题标题】:List generation from list containing lists using Linq使用 Linq 从包含列表的列表生成列表
【发布时间】:2018-03-29 11:27:16
【问题描述】:

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

我有以下列表,其中包含可变数量的其他列表,其中包含可变数量的“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; }
}

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

我已经使用 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 解决这个问题?

另外,也欢迎提出更好的标题。

【问题讨论】:

  • 只是为了检查逻辑是将所有a 扁平化到一个列表中,过滤掉带有Number 1 的列表,然后从这些对象中返回SomeClass
  • 您的循环似乎有误,您访问了两次list 而不是listOfAObjects

标签: c# linq


【解决方案1】:

试试

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

【讨论】:

    【解决方案2】:

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

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

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

    这使用SelectMany 将所有嵌套的IEnumerable&lt;IEnumerable&lt;T&gt;&gt; 折叠为IEnumerable&lt;T&gt;,其中TlistOfAObjects 中包含的元素类型,然后我们使用Select 子句将其投影到IEnumerable&lt;R&gt;最后我们将元素累积到一个List中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多