我如何使用LINQ转换这个

本文关键字:转换 LINQ 何使用 | 更新日期: 2023-09-27 18:12:35

我有以下代码片段,我的问题是,我如何使用简化的语法,也许使用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。

谢谢,迈克

我如何使用LINQ转换这个

我建议使用ObservableCollection<T>的这个构造函数,它允许您从现有的IEnumerable<T>构造集合。

在c# 4中,你可以这样做:

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

由于IEnumerable<T>界面的协方差,IEnumerable<SelectableUnit>可以看作是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)));

如果你经常做这类事情,考虑在IEnumerable<T>上写一个ToObservableCollection()扩展方法,让类型推理和/或方法链对你有利。

c# 3/.Net 3.5

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