c# – Linq GroupBy将每个空值作为一个组

前端之家收集整理的这篇文章主要介绍了c# – Linq GroupBy将每个空值作为一个组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个可空的int属性“GroupId”的对象.

有了这个对象的列表,我想在这个“GroupId”上做一个GroupBy.但是如果我这样做,所有的null值将组成一个组.

示例:

对象1:GroupId:NULL

对象2:GroupId:NULL

对象3:GroupId:1

对象4:GroupId:1

对象5:GroupId:2

对象6:GroupId:2

MyList.GroupBy(f => f.GroupId,key => new {Object = key});

我会得到3组.

如何取代4组?每个NULL值的一个组…

解决方法

这可能是最短的解决方案:
var grouped = MyList.GroupBy(f => f.GroupId != null ? (object)f.GroupId : new object(),key => new { Object = key });

注意,组的“键”将是对象类型.对于空元素,我创建一个新的“空”对象.对象的平等对象将使它们全部不同.对于非空数字,我只需将它们放在对象中.盒装整数维持相等运算符.所以:

new object().Equals(new object()) == false // always

((object)1).Equals((object)1) == true // always

((object)1).Equals((object)2) == false // always

更正确的解决方案将是实现IEqualityComparer< int?>

public class MyComparer : IEqualityComparer<int?> {
    public bool Equals(int? x,int? y) {
        if (x == null || y == null) {
            return false;
        }

        return x.Value == y.Value;
    }

    public int GetHashCode(int? obj) {
        return obj.GetHashCode(); // Works even if obj is null :-)
    }
}

并使用它:

var grouped2 = MyList.GroupBy(f => f.GroupId,key => new { Object = key },new MyComparer());

猜你在找的C#相关文章