#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>());