【问题标题】:Linq: List of lists to a long listLinq:列表列表到长列表
【发布时间】: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 的单一列表?

【问题讨论】:

    标签: c# linq


    【解决方案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 );
    

    【讨论】:

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