Ответ 1
Это, вероятно, самое короткое решение:
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 // 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());