Обнуляемый тип параметра <T>для универсального метода? - PullRequest
2 голосов
/ 11 января 2011

Я использую метод сводки, представленный по адресу: http://www.extensionmethod.net/Details.aspx?ID=147

Мой вопрос: как я могу использовать обнуляемый тип в качестве второго универсального ключа?

public static Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>> Pivot<TSource, TFirstKey, TSecondKey, TValue>(this IEnumerable<TSource> source, Func<TSource, TFirstKey> firstKeySelector, Func<TSource, TSecondKey> secondKeySelector, Func<IEnumerable<TSource>, TValue> aggregate) {
        var retVal = new Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>>();

        var l = source.ToLookup(firstKeySelector);
        //l.Dump("Lookup first key");
        foreach (var item in l) {
            var dict = new Dictionary<TSecondKey, TValue>();
            retVal.Add(item.Key, dict);
            var subdict = item.ToLookup(secondKeySelector);
            foreach (var subitem in subdict) {
                dict.Add(subitem.Key, aggregate(subitem));
            }
        }

        return retVal;
    }

Ответы [ 2 ]

3 голосов
/ 11 января 2011

Вы должны иметь возможность использовать обнуляемый тип , как правило, до тех пор, пока значения не равны нулю - но вы не можете использовать null (или пустой *)1006 *) в качестве ключа - он просто не может работать.

Было бы более разумно убедиться (в вызывающем коде), что secondKeySelector всегда возвращает что-то ненулевое;в случае Nullable<T> возможно, позвонив по номеру x => x.Foo.Value (если вы понимаете, что я имею в виду).

Другой подход заключается в декларативном исключении Nullable<T> здесь путем добавления where TSecondKey : struct - но так как string является общим ключом (и является ссылочным типом), это может быть нежелательным подходом.

0 голосов
/ 11 января 2011

Вы можете прямо указать использование Nullable<T> в общей декларации, что ограничит использование Nullable в вашем методе.

public static Dictionar<TFirstKey, Dictionary<Nullable<TSecondKey>, TValue>> Pivot<TSource, TFirstKey, TSecondKey, TValue>(this IEnumerable<TSource> source, Func<TSource, TFirstKey> firstKeySelector, Func<TSource, Nullable<TSecondKey>> secondKeySelector, Func<IEnumerable<TSource>, TValue> aggregate)
  where TSecondKey : struct
{}

В качестве использования Nullable<T>Вы должны повторить ограничение для T для вашей реализации.

Обратите также внимание, что Dictionary может не удовлетворять нулевой ключ.

...