【问题标题】:Merge 2 Lists of different types using LinQ使用 LinQ 合并 2 个不同类型的列表
【发布时间】:2016-08-14 01:32:12
【问题描述】:

我有 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&lt;string&gt;,一个List&lt;int&gt;,我如何(快速)获得类似的结果

List<string> myCars = new List<String> { "Yugo", "Aztec", "BMW" };
List<int> modeList = new List<int> { 1, 2, 3 };

【问题讨论】:

    标签: c# string linq list int


    【解决方案1】:

    首先要注意Enumerable.ConcatIEnumerable&lt;T&gt;的扩展方法,List&lt;T&gt;实现了这个接口。因此,您不需要为此使用 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&lt;T&gt;covariant

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

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

    【讨论】:

    • 赞成(这个答案很有用)的解释。
    【解决方案2】:

    由于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&lt;object&gt;

    编辑:

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

    【讨论】:

    • 谢谢。简单有效
    • @TungD.Nguyen 我会检查我的答案。这个答案是正确的,但我相信您不需要将所有内容都转换为字符串,而且我认为在您的情况下使用 LINQ 语句不应该是最好的解决方案。
    • from c in XXX select c 在做什么?这不就是身份单子吗?
    猜你喜欢
    • 2013-03-24
    • 2015-04-10
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多