如何使用LINQ转换它?

时间:2011-10-28 13:16:43

标签: 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。

谢谢, -Mike

2 个答案:

答案 0 :(得分:6)

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

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

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

由于IEnumerable<T>界面的thisIEnumerable<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)));

如果您经常这样做,请考虑在ToObservableCollection()上编写IEnumerable<T>扩展方法,让类型推断和/或方法链工作对您有利。

答案 1 :(得分:0)

在C#3 / .Net 3.5

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