我有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 };
答案 0 :(得分:5)
首先,您应该注意Enumerable.Concat
是IEnumerable<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
期望强类型数据类型,因此其中一种数据类型必须放弃。而在string
和int
之间,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。