C# Linq GroupBy并获取不为null的条目
类选择有4个属性:C# Linq GroupBy并获取不为null的条目,c#,linq,C#,Linq,类选择有4个属性: public class Selection { string IdSelectionType {get; set;} string Name {get; set;} decimal? OddValue {get; set;} bool Visible {get; set;} } 示例数据 var originalList = new List<Selection>() { new Sele
public class Selection
{
string IdSelectionType {get; set;}
string Name {get; set;}
decimal? OddValue {get; set;}
bool Visible {get; set;}
}
示例数据
var originalList = new List<Selection>()
{
new Selection() {IdSelectionType = "1", Name = "Under (75.50)", Visible = true},
new Selection() {IdSelectionType = "2", Name = "Under (75.50)", Visible = true},
new Selection() {IdSelectionType = "1", Name = "Under (75.50)", OddValue = 1.840m, Visible = true},
new Selection() {IdSelectionType = "2", Name = "Under (75.50)", OddValue = 1.860m, Visible = true},
};
预期结果将是:
您可以使用Union。选择所有没有OddValue==null的元素,然后根据第一个列表合并剩余的元素(具有null的元素) 工作示例: 首先按
Name
和OddValue
排序项目,然后按Name
分组。您将获得带有OddValue!=在带有OddValue==null的条目之前为null
。然后取每个分组的第一个条目
这将返回OddValue==null的条目,并且不会返回具有相同名称的其他条目
最终结果:您的代码和屏幕截图不一致-代码有OddValue
,屏幕截图有OddValure
。这是怎么回事?类中的OddValue不可为null;)只有OddValue:null的条目有什么区别?是否也要获取它们?如果您GroupBy
所有列并首先获取
,这与执行Distinct
相同。您的类也有4个属性,但在Linq查询中,您将其分组为5。分组后,通过排除OddValue和按OddValue排序(最后为null值),您可以选择一个包含所有键属性和值的新对象。首先(即OddValue),您可以尝试。选择(g=>g.FirstOrDefault(x=>x.OddValue!=null))
。它将选择它找到的第一个非null,如果没有,它将返回默认值,即null。但他似乎想要的是“OddValue==null”的条目,而没有另一个同名条目。是吗?他可以通过比较设置的参数和选择所有参数将结果与合并。或者他可以使用except创建列表。。。无论哪种方法都是好的。有些方法不起作用。。另一个例子很好用。如果你能告诉我什么不起作用就好了;)修正了,现在真的很好事实上这不是你真正的错误。来自另一个用户的数据集与真实的数据集不同(我没有意识到)。所以按名称分组只返回一个元素。
Selections.GroupBy(s =>
new {s.IdSelectionType, s.Name, s.OddValue, s.Visible})
.Select(g => g.First()).ToList();
var originalList = new[]
{
new Selection() {IdSelectionType = "1", Name = "Under (75.50)", Visible = true},
new Selection() {IdSelectionType = "2", Name = "Under (75.50)", Visible = true},
//new Selection() {IdSelectionType = "1", Name = "Under (75.50)", OddValue = 1.840m, Visible = true},
new Selection() {IdSelectionType = "2", Name = "Under (75.50)", OddValue = 1.860m, Visible = true},
};
var noneNulls = originalList.Where(ol => ol.OddValue != null);
var endList = originalList
.Where(ol => !noneNulls.Select(nn => nn.IdSelectionType).Contains(ol.IdSelectionType))
.Union(noneNulls);
var result = items.OrderBy(x => x.Name)
.ThenByDescending(x => x.OddValue)
.GroupBy(s => new {s.IdSelectionType, s.Name, s.Visible})
.Select(x => x.FirstOrDefault())
.ToList();