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:列表列表到长列表的主要内容,如果未能解决你的问题,请参考以下文章