c#LINQ从运行时信息创建匿名类型

时间:2011-03-28 13:00:49

标签: c# linq

假设我有一个在运行时填充的columnNames列表。我如何使用LINQ表达式为每个columnNames创建平均值,在按查询分组中,如:

        var result = from data in view.AsEnumerable()
                     group data by new {Group = data.Field<string>("group_no")}
                     into grp
                     select new
                     {
                         Group = grp.Key.Group,


                         //Add anonymous values for eachcolumn average
                     };

据我所知,你无法在匿名范围内进行枚举?

有办法做到这一点吗?

感谢。

2 个答案:

答案 0 :(得分:2)

你不能。

相反,你可以制作一本字典:

Averages = table.Columns.Cast<DataColumn>().ToDictionary(
    c => c.ColumnName, 
    c => grp.Average(dr => Convert.ToDouble(dr[c]))
)

Convert.ToDouble是必需的,因为我不知道coulmn是什么类型,Average需要特定的数字类型。
如果所有列都是相同的数字类型,则可以使用强制转换替换它。

答案 1 :(得分:0)

匿名类型是在编译时创建的。您无法从运行时信息中创建一个。此外,匿名类型具有方法范围,这意味着您无法返回它们并在其他地方使用它们。

根据您要做的事情(顺便说一下,您打算做什么?),您可能会看到动态类型。从(例如)ExpandoObject开始。或者,在运行时生成编译类型可能有意义。查看(例如)TypeBuilder。