【问题标题】:Selecting distinct with certain condition在特定条件下选择不同
【发布时间】:2013-06-17 23:48:28
【问题描述】:

我在列表中有值:

List1
ID    groupID   testNo
1     123       0
2     653       1
3     776       6
4     653       0

我想编写一个 T-Sql 或 linq 或 lambda 表达式,这样只要有重复,它就应该选择值为 !=0 的那个

我正在使用这个表达式,但它基本上没有给出我想要的结果。

 var list2 = list1.GroupBy(x => x.testNo).Select(y => y.First());

如何获得结果,以便选择 groupID 653 和 testNo 1 以及其余记录?

【问题讨论】:

  • 是否有可能一式三份或者只是一式两份?
  • 不只是重复。
  • 您的意思是“只要有重复的 groupID,它就应该选择 testNo!=0 的那个”?如果是这样,请编辑您的问题以澄清

标签: c# sql-server linq tsql lambda


【解决方案1】:

您可以采取几种方法。我不知道他们是否有充分的证据。一种方法是在testNo 上执行OrderBy,这样testNo 非零的项目将在0 之前出现。

var list2 = list1.Orderby(y => y.testNo).GroupBy(x => x.testNo).Select(z => z.FirstOrDefault());

如果你能保证testNo = 0 只出现在骗子身上,那么最简单的方法就是使用 where。

var list2 = list1.Where(x => x.testNo > 0).First();

【讨论】:

    【解决方案2】:

    这应该会给你想要的结果:

    var list2 = list1.GroupBy(x => x.groupID)
                     .Select(x => list1.Single(item => item.groupID == x.Key
                                  && item.testNo == x.Max(y => y.testNo)))
                     .ToList();
    

    基本上,按groupID 分组,然后从原始list1 中选择与不同的groupID 匹配且具有testNo 最大值的groupID 的每个项目。

    【讨论】:

      【解决方案3】:
       var result = list.GroupBy(x => x.groupID).Select(g => g.Count() == 1 ? g.First() : g.First(x => x.testNo != 0));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        相关资源
        最近更新 更多