Linq:将列表中的列表转换为长列表

32

我有一个类型为A的对象,该对象由一系列类型为B的对象组成:

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

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

list<A> listOfA = computeAList();

我希望选择列表中所有的C字符串。我原本希望以下语句能给我想要的结果,但它返回了包含C的列表:

[['A', 'B', 'C'], ['D', 'E', 'C'], ['F', 'G', 'C']]
var query = from objectA in listOfA
            select objectA.Alist.FindAll(x => x.C.Length > 0).C;
有没有办法获取一个包含所有 C 的单一列表?
2个回答

57

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的答案了;)。感谢你和Ray。 - ybo
1
到目前为止,我已经看了这个答案大约20次了。我不知道为什么我总是记不住“selectmany”,总是尝试“selectall”,但它总是发生。幸运的是,这只需要谷歌一下就可以解决! - Stachu

17

我的答案也差不多,我只是做了一点修改,加了一个where子句来避免空字符串(其中C为空):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接