2011-10-28 68 views
2

我有以下代碼片段,我的問題是,如何使用簡化的語法來演示此操作,也許使用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

回答

6

我建議使用this構造ObservableCollection<T>,它可以讓你從現有IEnumerable<T>構建集合。

在C#4,你可以這樣做:

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

因爲IEnumerable<T>接口的covariance,同比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))); 

如果你經常做這樣的事情,考慮寫一個ToObservableCollection()擴展方法在IEnumerable<T>讓類型推理和/或方法鏈工作在你的青睞。

0

在C#3/.NET 3.5

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