Linq:列表列表到长列表

Posted

技术标签:

【中文标题】Linq:列表列表到长列表【英文标题】:Linq: List of lists to a long list 【发布时间】:2010-10-13 13:57:30 【问题描述】:

我有一个A 类型的对象,它由B 类型的对象列表组成:

class A  list<B> Alist;
class B  string C; string D;

在我的程序中,我有一个A 对象列表:

list<A> listOfA = computeAList();

我想选择该列表中的所有C 字符串。我希望下面的语句能给我想要的结果;它返回包含C 的列表列表:

var query = from objectA in listOfA
            select objectA.Alist.FindAll(x => x.C.Length > 0).C;

有没有办法获得所有C 的单一列表?

【问题讨论】:

【参考方案1】:

ybo 的回答也是我的第一反应。与此等效的查询表达式是:

var query = from a in computeAList()
            from b in a.Alist
            select b.C;

为了完整起见,此线程中的其他答案是同一主题的变体。

来自 ybo(完全相同的查询,用点表示法表示):

var query = listOfA.SelectMany(a => a.Alist, (a, b) => b.C);

来自 Ray Hayes(包括 Where 子句;我已稍微重新格式化):

var query = listOfA.SelectMany(a => a.AList, (a, b) => b.C)
                   .Where(c => c.Length > 0);

【讨论】:

这正是我想要的——非常感谢乔恩! @Jon,抱歉我没有看到你的评论。现在可以包含Ray的答案;)。感谢你和雷。 到目前为止,我已经去过这个答案大约 20 次。我不知道为什么我不记得“selectmany”并且总是尝试“selectall”,但它总是会发生。幸运的是,这总是只有一个谷歌的距离!【参考方案2】:

我也会有类似的答案,我唯一的修改是添加 where 子句以避免出现空字符串(其中 C 为空):

listOfA.SelectMany( a => a.AList, (a, b) => b.C ).Where( c => c.Length > 0 );

【讨论】:

以上是关于Linq:列表列表到长列表的主要内容,如果未能解决你的问题,请参考以下文章

Linq 列表列表到单个列表

Linq:在列表中的列表上分组

CSharp使用另一个列表及其嵌套列表过滤带有LINQ查询的列表

使用 LINQ 展平列表列表以获取父/子列表

使用 Linq 将对象列表分组为新的对象列表分组列表

Linq - 对列表列表进行操作