Функциональность AddRange / Concat внутри лямбда Выберите выражение

StackOverflow https://stackoverflow.com/questions/3923155

Вопрос

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

List<Foo> fooList;

Как получить список всех идентификаторов предметов, упомянутых внутри fooList?

var items = fooList
             .Select(
              /*
                f => f.PrimaryItem;
                if (f.HasOtherItems)
                    AddRange(f => f.OtherItems)
              */  
              ).Distinct();
Это было полезно?

Решение

Использовать SelectMany и у него вернется один сокровенный список PrimaryItem и OtherItems (если они присутствуют):

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

Другие советы

Как небольшое изменение:

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

Это принимает набор PrimaryItem, и где HasOtherItems устанавливается) объединяет комбинированный набор OtherItems. Отказ То Union обеспечивает отличное.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top