这可能是最短的解决方案:
var grouped = MyList.GroupBy(f => f.GroupId != null ? (object)f.GroupId : new object(), key => new { Object = key })
请注意,分组的“键”将是object
类型。对于null
元素,我创建一个新的“空”object
。对象的相等比较器将使它们全部不同。对于非空数字,我只需将它们装箱为对象。装箱的整数保持相等运算符。所以:
new object().Equals(new object()) == false
and
((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();
}
}
并使用它:
var grouped2 = MyList.GroupBy(f => f.GroupId, key => new { Object = key }, new MyComparer());
GroupBy
会保持元素/组的顺序,而你的解决方案会破坏顺序。 - xanatos