泛型参数类型<t>是否为泛型方法?</t>

时间:2011-01-11 09:30:08

标签: c# types pivot generics

我正在使用以下提供的pivot方法: 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 个答案:

答案 0 :(得分:3)

只要值不为空,您就应该能够正常使用可以为空的类型 - 但不能使用null(或者一个空的Nullable<T>)作为一个关键 - 它根本无法工作。

确保(在调用代码中)secondKeySelector总是返回非空的东西更有意义;在Nullable<T>的情况下,也许可以通过调用x => x.Foo.Value(如果你明白我的意思)。

另一种方法是通过添加Nullable<T>以声明方式排除where TSecondKey : struct - 但由于string是公共密钥(并且是引用类型),这可能是一种不受欢迎的方法

答案 1 :(得分:0)

您可以在通用声明中明确使用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可能对null键不满意。