C# 有条件的选择
我有一个列表中的值:C# 有条件的选择,c#,sql-server,linq,tsql,lambda,C#,Sql Server,Linq,Tsql,Lambda,我有一个列表中的值: 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 =&g
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());
我如何才能获得结果,以便使用testNo 1和其余记录选择groupID 653?您可以采取几种方法。我不知道他们是否有充分的证据。一种方法是在
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();
这将为您提供所需的结果:
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
匹配并具有该groupID
的最大值的testNo
的每个项目,是否也可以有三份副本或仅重复?不,仅重复。您的意思是“每当有重复时”groupID它应该选择一个带有testNo的=0'? 如果是,请编辑您的问题以澄清
var result = list.GroupBy(x => x.groupID).Select(g => g.Count() == 1 ? g.First() : g.First(x => x.testNo != 0));