Как мне выполнить это с помощью LINQ?

#c# #linq

#c# #linq

Вопрос:

У меня есть следующий фрагмент, мой вопрос в том, как мне выполнить это, используя упрощенный синтаксис, возможно, используя синтаксис LINQ?

  private ObservableCollection<ISelectableItem> GetSelectableUnits(ObservableCollection<Unit> units)
        {
            var selectableUnits = new ObservableCollection<ISelectableItem>();

            units.ToList().ForEach(item=>selectableUnits.Add(new SelectableUnit(item)));

            return selectableUnits;
        }
  

Примечание:SelectableUnit реализует ISelectableItem .

Спасибо, -Майк

Ответ №1:

Я предлагаю использовать этот конструктор ObservableCollection<T> , который позволяет создавать коллекцию из существующей IEnumerable<T> .

В C # 4 вы можете сделать:

 return new ObservableCollection<ISelectableItem>
           (units.Select(item => new SelectableUnit(item)));
  

Из-за ковариации IEnumerable<T> интерфейса an IEnumerable<SelectableUnit> можно рассматривать как an IEnumerable<ISelectableItem> .

В C # 3, который не поддерживает различия в общих интерфейсах, вы можете сделать:

 return new ObservableCollection<ISelectableItem>
           (units.Select(item => new SelectableUnit(item)).Cast<ISelectableItem>());
  

(или)

  return new ObservableCollection<ISelectableItem>
               (units.Select(item => (ISelectableItem)new SelectableUnit(item)));
  

Если вы часто занимаетесь подобными вещами, подумайте о написании ToObservableCollection() метода расширения IEnumerable<T> , чтобы позволить логическому выводу и / или цепочке методов работать в вашу пользу.

Ответ №2:

В C # 3 / .Net 3.5

 return new ObservableCollection<ISelectableItem>
           (units.Select(item => new SelectableUnit(item)).Cast<ISelectableItem>());