我有一个可以为null的int属性"GroupId"的对象.
有了这个对象的List,我想在这个"GroupId"上做一个GroupBy.但是,如果我这样做,所有空值将形成一个组.
示例:
对象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});
Run Code Online (Sandbox Code Playgroud)
我会得到3组.
我怎样才能获得4组呢?每个NULL值的组...
这可能是最短的解决方案:
var grouped = MyList.GroupBy(f => f.GroupId != null ? (object)f.GroupId : new object(), key => new { Object = key });
Run Code Online (Sandbox Code Playgroud)
请注意,组的"键"将是object类型.对于null元素,我创建一个新的"空" object.对象的相等比较器将使它们全部不同.对于非空数字,我只需将它们放在一个对象中.盒装整数维持等式运算符.所以:
new object().Equals(new object()) == false // always
Run Code Online (Sandbox Code Playgroud)
和
((object)1).Equals((object)1) == true // always
Run Code Online (Sandbox Code Playgroud)
和
((object)1).Equals((object)2) == false // always
Run Code Online (Sandbox Code Playgroud)
一个更正确的解决方案是实施一个 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 :-)
}
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
var grouped2 = MyList.GroupBy(f => f.GroupId, key => new { Object = key }, new MyComparer());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6601 次 |
| 最近记录: |