C# Linq GroupBy并获取不为null的条目

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

类选择有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 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();