我正在使用以下提供的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;
}
答案 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键不满意。