如何在LINQ中分组2个不同的序列?

时间:2014-03-03 18:21:26

标签: c# linq

如何通过下一个键将两个不同的(第一个typeof years == IEnumerable<string>和第二个typeof occurs = IEnumerable<int>)序列分组为一个序列:如果occurs中的数字相同,则按{{1 }},否则years只使用occurs订购?

我通过以下方式获得了这些序列:

LINQ

因此变量var years = some_strings.Select(x => x.Split(' ')[1]); var occurs = years.Select(x => years.Count(e => e == x)); 仅包含带有年份的字符串,years包含第一个序列中相同年份的计数。

我无法理解occurs中的这些技巧。

我会做这样的事吗?

LINQ

我应该在哪里使用第二个序列? 也许我可以在1个查询中获得这些序列然后处理它?<​​/ p>

UPD

我使用匿名类(?)修改了我的2个查询:

occurs.GroupBy(x => x ???

因此,它有多年并且都在其中发生。

我正在尝试获取下一个字符串:

    some_strings.Select(x => x.Split(' ')[1]).
    GroupBy(x => x).
    Select(x => new {num = x.Key, count = x.Count() })

现在,使用所需的值进行查询,如何将其排序为前述条款?

1 个答案:

答案 0 :(得分:4)

你非常接近。这应该为您提供类似于最新更新的字符串列表:

var occurences
    = years.GroupBy(x => x)
           .Select(x => new { Year = int.Parse(x.Key), Count = x.Count() })
           .OrderBy(x => x.Count)
           .ThenBy(x => x.Year)
           .Select(x => string.Concat(x.Count, " ", x.Year))
           .ToList();

使用您创建的匿名类型,您可以:

  • 按计数排序
  • 然后按年
  • 最后使用string.Concat
  • 创建字符串列表

(请注意,如果int.Parse中的任何字符串实际上不是数字, years 将引发异常