为了账号安全,请及时绑定邮箱和手机立即绑定

Linq GroupBy 并取不为空的条目

Linq GroupBy 并取不为空的条目

C#
哈士奇WWW 2022-01-15 19:34:24
Selection 类有 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},        };我想选择一个列表,如果有另一个相同但具有 OddValue 的元素!= null,则丢弃具有 OddValue = null 的元素。是否有任何 Linq / MoreLinq 运算符可以做类似的事情?Selections.GroupBy(s =>          new {s.IdSelectionType, s.Name, s.OddValue, s.Visible})          .Select(g => g.First()).ToList();预期的结果是:
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

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

首先对项目排序NameOddValue然后按分组NameOddValue != null在带有 的条目之前,您将拥有带有的条目OddValue == null。然后取每个分组的第一个条目。

这也将返回OddValue == null具有相同的条目,而没有其他条目Name

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


查看完整回答
反对 回复 2022-01-15
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你可以使用联合。选择所有不具有 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


查看完整回答
反对 回复 2022-01-15
  • 2 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信