0

我在列表中有值:

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 和其余的记录?

4

3 回答 3

1

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

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();
于 2013-06-17T23:59:04.783 回答
0

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

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中选择与 distinct 匹配groupID并具有最大值的testNo每个项目groupID

于 2013-06-18T00:43:39.663 回答
0
 var result = list.GroupBy(x => x.groupID).Select(g => g.Count() == 1 ? g.First() : g.First(x => x.testNo != 0));
于 2013-06-18T05:42:28.433 回答