C# 如何从该方法返回Dictionary?

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},

我有一个LINQ语句,它返回下面类的IQueryable

类别:

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))
      );