@lucky4

Как загнать в dictionary key как null?

Есть список листовый, где я хочу сгрупировать его по полю, но поле может быть int?
asd.Value?.GroupBy(x => x.ParentId == null ? 0 : x.ParentId).ToDictionary(gg => gg.Key, gg => gg.ToList());


Получаю ошибку
The type 'int?' cannot be used as type parameter 'TKey' in the generic type or method 'Enumerable.ToDictionary(IEnumerable, Func, Func)'. Nullability of type argument 'int?' doesn't match 'notnull' constraint.

как мне тогда сгрупировать данные отдельно в дикшнри?
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Условный оператор в возвращаемом выражении в лямбде в GroupBy формально имеет тип результата int?, и у ситаксического анализатора при выводе типа возвращаемого значения не хватило то ли мозгов догадаться, что результат не может быть null, то ли полномочий изменить тип возвращаемого выражения на int.
Упростите ему задачу: используйте операцию объединения с null (?? - null-coalescing), тип ее результата гарантированно не-nullable:
asd.Value?.GroupBy(x => x.ParentId??0 ).ToDictionary(gg => gg.Key, gg => gg.ToList());
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Напиши обертку
var dict = new Dictionary<MyNullableInt, string>();
dict[null] = "hello, world!";

Console.WriteLine(dict[null]); // Output: hello, world!


struct MyNullableInt: IEquatable<MyNullableInt>, IEquatable<int?>
{
    public int? Value { get; set; }
    public bool Equals(MyNullableInt other)
    {
        return other.Value == Value;
    }

    public bool Equals(int? other)
    {
        return other == Value;
    }

    public static implicit operator MyNullableInt(int? value)
    {
        return new MyNullableInt() {Value = value};
    }

    public static implicit operator int?(MyNullableInt value)
    {
        return value.Value;
    }
    
    public override bool Equals(object? obj)
    {
        if (obj is int value)
        {
            return value == Value;
        }

        if (obj is MyNullableInt mni)
        {
            return mni.Value == Value;
        }

        return false;
    }

    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы