lambda Select表达式中的AddRange / concat功能

时间:2010-10-13 11:31:51

标签: c# linq select lambda addrange

class Foo
{
    int PrimaryItem;
    bool HasOtherItems;
    IEnumerable<int> OtherItems;
}

List<Foo> fooList;

如何获取fooList中引用的所有项ID的列表?

var items = fooList
             .Select(
              /*
                f => f.PrimaryItem;
                if (f.HasOtherItems)
                    AddRange(f => f.OtherItems)
              */  
              ).Distinct();

2 个答案:

答案 0 :(得分:7)

使用SelectMany并让它返回PrimaryItemOtherItems的连锁列表(如果它们存在):

var result = fooList
    .SelectMany(f => (new[] { f.PrimaryItem })
        .Concat(f.HasOtherItems ? f.OtherItems : new int[] { }))
    .Distinct();

答案 1 :(得分:1)

略有变化:

var items = fooList.Select(i => i.PrimaryItem).Union(
      fooList.Where(foo => foo.HasOtherItems).SelectMany(foo => foo.OtherItems));

这需要PrimaryItem的集合,并且(其中设置HasOtherItems)连接OtherItems的组合集。 Union确保不同。