2010-01-05 89 views
4

我想轉換List<Company>List<ICompany>如何列出<Company>到列表轉換<ICompany>

ICompany是一個接口,它Company工具。

public List<ICompany> FindAll() 
{ 
    List<Company> companies = new List<Company>(); 

    var query = from c in _scope.Extent<Company>() 
       select c; 

    companies = query.ToList(); 

    return companies.ToList<ICompany>(); // doesn't work 
    //and 
    return companies.ToList(); // doesn't work 
} 

有什麼想法?

回答

25

使用Enumerable.Cast

return query.Cast<ICompany>().ToList(); 

幾點意見:

List<Company> companies = new List<Company>(); 

這將創建一個新的列表。但是你從來沒有使用它,因爲兩行以後你

companies = query.ToList(); 

覆蓋您所創建的列表(和在中間線你永遠參考companies)。如果你願意,你可以聲明並獲得一舉結果:

List<Company> companies = query.ToList(); 

其次,這一切都是不必要的,如果你只是想返回結果的列表。簡潔(在某種程度上)是編程方面的一大優勢。 「越少越好」的意思是,越少的代碼意味着寫入的代碼越少,測試代碼越少,維護代碼越少。通過編寫更少的代碼提高生產力!這是你的方法的短版:

public List<ICompany> FindAll() { 
    var query = from c in _scope.Extent<Company>() 
       select c; 
    return query.Cast<ICompany>().ToList(); 
} 

甚至

public List<ICompany> FindAll() { 
    return _scope.Extent<Company>().Cast<ICompany>().ToList(); 
} 

第三,至少,你應該考慮回國的IList代替List。編碼到接口而不是具體類型更好。這將您的代碼從實現細節中分離出來,使代碼更易於更改並更易於測試。

最後,你應該檢查你是否真的需要返回List。你使用的是什麼方法?如果你只是用它來枚舉結果(foreach(var item in list)),那麼你應該將返回一個IEnumerable<ICompany>

public IEnumerable<ICompany> FindAll() { 
    return _scope.Extent<Company>().Cast<ICompany>(); 
} 
+1

+1對於很好的解釋(並根據最後的評論進行調整...) – 2010-01-05 01:25:32

+0

是的,謝謝你指出,這使我給他的代碼比我最初做的更仔細的檢查。 – jason 2010-01-05 01:46:57

+0

偉大的審查。也許是因爲我被困在2.0的土地上,但是不需要「回報」? – 2010-01-05 01:52:37

3
return companies.Cast<ICompany>().ToList(); 
0

如果由於某種原因,你不想使用Enumerable.Cast(雖然我會建議這樣做與其他意見一起)你總是可以做到這一點:

companies = query.ToList(); 
List<ICompany> ret = new List<ICompany>(); 
foreach (Company c in companies) 
{ 
    ret.Add(c as ICompany); 
} 

這幾乎是相同的解決方案Skeolan的,但如果(ICompany)c failes它拋出。在我的代碼中,如果轉換失敗,c as ICompany將返回null。

1

除了Enumerable.Cast答案,如果你發現自己公司和ICompany的集合之間往來很多,另一個建議可能是自Collection <牛逼>派生自己的集合類稱爲CompanyCollection並使其實現IList <ICompany>。

如果您使用的是.NET 4。0(目前處於測試階段),您可以利用generic covariance,這允許您更隱含地執行此操作。

+0

+1提到協變性(並驚訝於這是唯一的答案) – 2010-01-05 05:57:14

相關問題