使用LinQ合并2个不同类型的列表

时间:2016-04-21 04:20:19

标签: c# string linq list int

我有2个清单。如果它们都是string类型。我可以使用类似的东西合并它们:

List<string> myCars = new List<String> { "Yugo", "Aztec", "BMW" };
List<string> modeList = new List<String> { "BMW", "Saab", "Aztec" };
var carConcat = (from c in myCars select c)
.Concat(from c2 in modeList select c2);

但是,如果我有一个List<string>,一个List<int>

,我怎样才能获得(快速)类似的结果
List<string> myCars = new List<String> { "Yugo", "Aztec", "BMW" };
List<int> modeList = new List<int> { 1, 2, 3 };

2 个答案:

答案 0 :(得分:5)

首先,您应该注意Enumerable.ConcatIEnumerable<T>的扩展方法,List<T>实现此接口。因此,您不需要使用LINQ语法:

// When both lists are of string...
IEnumerable<string> all = myCars.Concat(modeList);

另一方面,如果你想混合两个列表,但其中一个列表具有不同的泛型类型,那么,你仍然可以将它们混合在一起,将所有项目转换为object

IEnumerable<object> all = myCars.Cast<object>().Concat(modeList.Cast<object>());

...或者IEnumerable<T>covariant

IEnumerable<object> all = ((IEnumerable<object>)myCars).Concat(modeList.Cast<object>());

上述解决方案的主要缺点是,您需要将引用存储为object的极少数情况,因为您强制您的代码稍后向下转发它们如果你想访问他们的成员(即方法,属性......),再次使用实际类型。

答案 1 :(得分:4)

由于List期望强类型数据类型,因此其中一种数据类型必须放弃。而在stringint之间,int始终可以表示为string,但并非所有string都可以表示为int(在特定范围内仅为数字类型)。因此,int数据类型应该放弃。

然后,您可以使用ToString()int数据类型更改为string,并将其与原始List相结合。

List<string> myCars = new List<String> { "Yugo", "Aztec", "BMW" };
List<int> modeList = new List<int> { 1, 2, 3 };
var carConcat = myCars.Concat(from c2 in modeList select c2.ToString());

或者,您可以创建包含所有数据类型的List<object>

修改

请注意,您还可以移除身份选择(from c in myCars select c),并将其记入Aron's comment