C# 如何从该方法返回Dictionary?
我有一个LINQ语句,它返回下面类的IQueryable 类别:C# 如何从该方法返回Dictionary?,c#,linq,dictionary,C#,Linq,Dictionary,我有一个LINQ语句,它返回下面类的IQueryable 类别: public class SupplierSummaryReport { public int Year { get; set; } public string SupplierName { get; set; } public decimal TurnOverValues { get; set; } } 例如:{2012,供应商1,90},
public class SupplierSummaryReport {
public int Year { get; set; }
public string SupplierName { get; set; }
public decimal TurnOverValues { get; set; }
}
例如:{2012,供应商1,90},{2011,供应商2,95}
然而,我需要将这些数据转换成一个字典字典。我有我和一个朋友建立的扩展方法,但是我们在最后一部分被难住了
扩展方法:
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<TSource, TValue> Value) {
var retVal = new Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>>();
var l = source.ToLookup(firstKeySelector);
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, subitem.Value /*Insert value here*/);
}
}
return retVal;
}
如果有人需要更多信息,请告诉我。TL;DR,但如果您拥有的是一个IEnumerable,并且您确信每个供应商名称、年份、营业额组合都是唯一的,或者可以使其成为唯一的,那么ToDictionary使这变得简单:
var data = new List<SupplierSummaryReport> { ... };
// avoiding var just to verify correct result Type
Dictionary<string, Dictionary<int, decimal>> result = data
.GroupBy(ssr => ssr.SupplierName)
.ToDictionary(g1 => g1.Key, g1 => (
g1.GroupBy(g2 => g2.Year)
.ToDictionary(g3 => g3.Key,
g3 => g3.First().TurnOverValues))
);
也许g3.First应该变成.Single或.Sum之类。只是说,这是扩展方法的一个大签名。你确定你需要一本字典吗?@Hayden是的,数据在数据库中是按层次顺序排列的,视图需要更平坦的模型中的数据,不幸的是,当你接近像你这样的点时,这是我们唯一能想到的方法——当你有三个或更多嵌套的泛型类时,您可能应该停止并考虑创建自己的类层次结构,这些类显然可以从那些字典继承,因为一个月后您将无法理解您创建的层次结构。更不用说你的代码对其他程序员的可读性了。。。
{Supplier1, {2012,60}}, {Supplier2, {2014,90}}
var data = new List<SupplierSummaryReport> { ... };
// avoiding var just to verify correct result Type
Dictionary<string, Dictionary<int, decimal>> result = data
.GroupBy(ssr => ssr.SupplierName)
.ToDictionary(g1 => g1.Key, g1 => (
g1.GroupBy(g2 => g2.Year)
.ToDictionary(g3 => g3.Key,
g3 => g3.First().TurnOverValues))
);