2011-10-28 2 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을 구현합니다.

감사합니다, - 마이크

답변

6

나는 기존 IEnumerable<T>에서 컬렉션을 구성 할 수 있습니다 ObservableCollection<T>this 생성자를 사용하는 것이 좋습니다.

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

서면을 고려 type-inference 및/또는 method-chaining을 사용할 수 있도록 extension-method를 IEnumerable<T>에 추가하십시오. C#으로

0

3/NET 3.5

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