代码之家  ›  专栏  ›  技术社区  ›  Revious

Linq GroupBy并获取不为null的条目

  •  -3
  • Revious  · 技术社区  · 6 年前

    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},
            };
    

    有没有Linq/MoreLinq操作符可以做类似的事情?

    Selections.GroupBy(s =>
              new {s.IdSelectionType, s.Name, s.OddValue, s.Visible})
              .Select(g => g.First()).ToList();
    

    enter image description here

    预期结果将是: enter image description here

    2 回复  |  直到 6 年前
        1
  •  1
  •   Revious    6 年前
    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();
    

    Name OddValue 然后分组 . 您将有与 OddValue != null 在输入之前 OddValue == null . 然后取每个分组的第一个条目。

    OddValue==null 没有其他条目与此相同 姓名

    最终结果: https://dotnetfiddle.net/jZ5gs2

        2
  •  1
  •   Revious    6 年前

    你可以用工会。选择所有没有OddValue==null的元素,然后将剩余的元素(具有null的元素)与第一个列表合并。

    https://linqsamples.com/linq-to-objects/set/Union

    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);
    

    https://dotnetfiddle.net/UJ8FaS