C# 如何使用此示例在Linq中动态透视

C# 如何使用此示例在Linq中动态透视,c#,linq,C#,Linq,下面的问题在代码中,即表示DY1=,DY2=,等等的位。我不知道会有多少个,所以我需要动态执行 这是我的文本文件: Product, Origin Year, Development Year, Incremental Value Comp, 1992, 1992, 110.0 Comp, 1992, 1993, 170.0 Comp, 1993, 1993, 200.0 Non-Comp, 1990, 1990, 45.2 Non-Comp, 1990, 1991, 64.8 Non-Comp

下面的问题在代码中,即表示DY1=,DY2=,等等的位。我不知道会有多少个,所以我需要动态执行

这是我的文本文件:

Product, Origin Year, Development Year, Incremental Value
Comp, 1992, 1992, 110.0
Comp, 1992, 1993, 170.0
Comp, 1993, 1993, 200.0
Non-Comp, 1990, 1990, 45.2
Non-Comp, 1990, 1991, 64.8
Non-Comp, 1990, 1993, 37.0
Non-Comp, 1991, 1991, 50.0
Non-Comp, 1991, 1992, 75.0
Non-Comp, 1991, 1993, 25.0
Non-Comp, 1992, 1992, 55.0
Non-Comp, 1992, 1993, 85.0
Non-Comp, 1993, 1993, 100.0
这是我的代码(从LinqPad粘贴):


我能提供的最好建议是为每个可能的DY返回一个值数组

首先,将
产品
查询中的
增量值
字段修改为
双精度
(即
double.Parse(parts[3])

现在为最大数量的DY创建一个可枚举项:

    var dys = Enumerable.Range(1, products.Max(p => p.DY));
然后,
grps
查询如下所示:

    var grps =
        from p in products
        group p by new
        {
            p.Product,
            p.Origin_Year,
        } into g
        let lookup = g.ToLookup(x => x.DY, x => x.Incremental_Value)
        select new
        {
            g.Key.Product,
            g.Key.Origin_Year, 
            DYs = dys.Select(x => lookup[x].Sum()).ToArray(),
        };

这对你有用吗?

你的努力产生了与我已经想到的相同的结果,只是更好,即DY位于阵列中正确的位置,始终是正确的长度。我已经用foreach循环将结果输出到一个SQL表中,我突然想到,每个数组的嵌套foreach循环可以很好地解决我的问题,而且它已经解决了。非常感谢。
    var dys = Enumerable.Range(1, products.Max(p => p.DY));
    var grps =
        from p in products
        group p by new
        {
            p.Product,
            p.Origin_Year,
        } into g
        let lookup = g.ToLookup(x => x.DY, x => x.Incremental_Value)
        select new
        {
            g.Key.Product,
            g.Key.Origin_Year, 
            DYs = dys.Select(x => lookup[x].Sum()).ToArray(),
        };