【问题标题】:linq group by, order bylinq 分组依据,排序依据
【发布时间】:2016-04-30 01:06:35
【问题描述】:

我有以下列表

ID  Counter  SrvID FirstName
--  ------   ----- ---------  
1   34       66M   James
5   34       66M   Keith
3   55       45Q   Jason
2   45       75W   Mike
4   33       77U   Will

我喜欢做的是按 ID 升序排序,然后 获取相同的 Counter、SrvID 的第一个值(如果有)。

所以输出会是这样的:

ID  Counter  SrvID FirstName
--  ------   ----- ---------  
1   34       66M   James
2   45       75W   Mike
3   55       45Q   Jason
4   33       77U   Will

注意 ID 5 是如何从列表中删除的,因为 Counter 和 SrvID 与我对 ID 1 的相同,但 ID 1 排在第一位 我删除了 5 个。

这是我会做但不工作的事情

    var result = (from ls in list1
                  group ts by new {ls.Counter, ls.SrvID}
                order by ls.ID
                  select new{
                             ls.ID,
                             ls.Counter.FirstOrDefault(),
                             ls.SrvID.First,
                             ls.FirstName}).ToList()

【问题讨论】:

  • @ChrisWue - 感谢您调整格式。你是怎么把它格式化成表格的?
  • 这只是标准代码格式:缩进 4 个空格

标签: c# linq


【解决方案1】:
list1.GroupBy(item => new { Counter = item.Counter, SrvID = item.SrvID })
     .Select(group => new { 
        ID = group.First().ID, 
        Counter = group.Key.Counter,
        SrvID = group.Key.SrvID,
        FirstName = group.First().FirstName})
     .OrderBy(item => item.ID);

【讨论】:

  • 感谢您的回复。为什么 FirstName 和 ID 旁边有一个 First()?
  • GroupBy 将向您返回一个 Counter/SrvID 以进行项目查找,每个查找成员都有一个键 (Counter/SrvID) 和关联的项目。因此,对于每个查找组,您可以从键中提取 Counter/SrvID,并从每个组中的第一个匹配项中提取 ID 和 FirstName。
  • @vc74 谢谢你的回答。您能否详细说明 LINQ 表达式中发生了什么?
  • @BKSpureon 您希望我详细说明查询的哪一部分?
  • @BKSpureon 它基本上为源集合中的每个项目创建一个动态类型的新实例(具有 Counter 和 SrvID 属性)。编译器自动构建的类型具有结构语义,这意味着在比较期间,将比较其所有属性,在这种情况下,项目将按 Counter 和 SrvID 分组。
【解决方案2】:

将记录分组,并从每组中选出一名获胜者。

var query =
  from record in list1
  group record by new {record.Counter, record.SrvID } into g
  let winner =
  (
    from groupedItem in g
    order by groupedItem.ID
    select groupedItem
  ).First()
  select winner;

var otherQuery = list1
  .GroupBy(record => new {record.Counter, record.SrvID })
  .Select(g => g.OrderBy(record => record.ID).First());

【讨论】:

  • 感谢您的回复 - 请您进一步说明 var query = from record in list1 的工作原理。再次感谢
  • 这个答案的第一行可能是我见过的用真实英语描述 GroupBy 用法的最佳方式。
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2014-04-23
相关资源
最近更新 更多