2017-10-10 116 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

相关问题