【问题标题】:Join 2 lists by order instead of condition in LINQ按顺序而不是 LINQ 中的条件加入 2 个列表
【发布时间】:2009-04-23 23:09:02
【问题描述】:

我怎样才能加入 2 个相等长度的列表(以生成第 3 个相等长度的列表),我不想指定条件,而只是依赖 2 个列表中的项目顺序。

例如我如何加入:

{1,2,3,4} with {5,6,7,8}

生产:

{{1,5}, {2,6}, {3,7}, {4,8}}

我尝试了以下方法:

from i in new []{1,2,3,4}
from j in new []{5,6,7,8}
select new { i, j }

但这会产生交叉连接。当我使用join时,我总是需要指定“on”。

【问题讨论】:

    标签: linq join linq-to-objects


    【解决方案1】:

    您可以在第一个列表中使用Select,使用项目索引并访问第二个列表中的元素:

    var a = new [] {1,2,3,4};
    var b = new [] {5,6,7,8};
    
    var qry = a.Select((i, index) => new {i, j = b[index]}); 
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 .Net 4.0,则可以使用 Zip 扩展方法和元组。

      var a = new [] {1,2,3,4};
      var b = new [] {5,6,7,8};
      
      var result = a.Zip(b, (an, bn) => Tuple.Create(an, bn));
      

      或者,您可以将它们保存为数组:

      var resultArr = a.Zip(b, (an, bn) => new []{an, bn});
      

      【讨论】:

        【解决方案3】:

        如果你想使用查询语法,有一个中途的解决方案。从某种意义上说,您需要在两个列表上使用 Select 方法才能获得将在 where 子句中使用的索引。

        int[] list1 = {1,2,3,4};
        int[] list2 = {5,6,7,8};
        
        var result = from item1 in list1.Select((value, index) => new {value, index})
                     from item2 in list2.Select((value, index) => new {value, index})
                     where item1.index == item2.index
                     select new {Value1 = item1.value, Value2 = item2.value};
        

        此解决方案的好处是,如果列表具有不同的长度,它不会失败,就像使用索引器的解决方案一样。

        【讨论】:

          猜你喜欢
          • 2021-10-19
          • 2021-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-17
          • 1970-01-01
          相关资源
          最近更新 更多