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

3

我有两个列表。如果它们都是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个回答

6
首先,您应该注意到 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>协变的:

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

以上解决方案的主要缺点是,在一些特殊情况下,你可能需要将引用存储为 object,但这会强制你在后续代码中再次将它们降级为实际类型,以便访问它们的成员(即方法、属性等)。

对于这个解释,点赞(表示有用)。 - Ian

5
由于 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的评论


1
谢谢。简单而有效。 - T D Nguyen
@TungD.Nguyen 我会检查我的答案。这个答案是正确的,但我认为你不需要将所有内容都转换为字符串,而且在你的情况下使用LINQ语句可能不是最好的解决方案。 - Matías Fidemraizer
from c in XXX select c 做了什么?这不就是恒等单子吗? - Aron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接