2017-10-10 134 views
1

在一個類中,我處理一個IInterface的列表。合併兩個實現相同接口的類的列表

我想在一個獨立的方式來處理的兩種可能的實現,因此:

public List<IInterface> Process(List<IInterface> InterfaceList) 
{ 
    List<FirstImplementation> FirstList = FirstProcess(InterfaceList.OfType<FirstImplementation>.ToList()); 

    List<SecondImplementation> SecondList = SecondProcess(InterfaceList.OfType<SecondImplementation>.ToList()); 

    return new List<IInterface> { 
    FirstList, 
    SecondList 
}; 

} 

我想返回List<IInterface>,相同的輸入,無論它原來是比預期的更困難

return new List<IInterface> { 
    FirstList, 
    SecondList 
}; 

編譯但拋出在運行時一個InvalidCastException,

return new List<IInterface>.AddRange(FirstList).AddRange(SecondList); 

甚至沒有編譯...

什麼是正確的方法來做到這一點?

+0

您的最後一個示例幾乎是正確的。它缺少括號,'AddRange'返回類型爲'void',所以你不能鏈接在一起:'var ret = new List (); ret.AddRange(FirstList); ret.AddRange(SecondList); return ret;' –

回答

7

使用LINQ:

return FirstList.Cast<IInterface>().Concat(SecondList.Cast<IInterface>()).ToList(); 

Cast<>返回一個枚舉(頭腦LINQ的延遲執行)與轉換爲目標類型元素,Concat結合了兩種可枚舉和ToList變成結果到一個列表(和物化LINQ查詢)。

正如@Evk注意到的那樣,當兩種類型都隱式轉換爲輸出類型(就像你的情況一樣,你可以將兩個類型轉換爲它們的通用接口),你可以完全跳過轉換(儘管在這種情況下,您需要明確指定類型進行拼接),如下所示:

return FirstList.Concat<IInterface>(SecondList).ToList(); 
+1

第二次你甚至不需要'.Cast '。 –

+1

你根本不需要Cast,你可以做'FirstList.Concat (SecondList).ToList();' – Evk

+0

正確的,我正在寫一個更通用的例子,其中沒有隱式轉換。 – decPL

相關問題