C# c LINQ从运行时信息创建匿名类型
假设我有一个在运行时填充的列名列表。如何使用LINQ表达式在分组查询中为每个列名创建平均值,例如:C# c LINQ从运行时信息创建匿名类型,c#,linq,C#,Linq,假设我有一个在运行时填充的列名列表。如何使用LINQ表达式在分组查询中为每个列名创建平均值,例如: var result = from data in view.AsEnumerable() group data by new {Group = data.Field<string>("group_no")} into grp select ne
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
};
据我所知,你不能在匿名范围内枚举吗
有办法做到这一点吗
谢谢。你不能
相反,您可以制作字典:
Averages = table.Columns.Cast<DataColumn>().ToDictionary(
c => c.ColumnName,
c => grp.Average(dr => Convert.ToDouble(dr[c]))
)
需要Convert.ToDouble,因为我不知道coulmn是什么类型,Average需要一个特定的数字类型。
如果所有列都是相同的数字类型,则可以使用强制转换替换该类型。匿名类型是在编译时创建的。无法根据运行时信息创建一个。此外,匿名类型具有方法作用域,这意味着您无法返回它们并在其他地方使用它们
根据您要做的事情,顺便说一句,您可以查看动态类型。从ExpandooObject开始。或者,在运行时生成编译类型可能有意义。看看例如TypeBuilder。那没有意义;你不能对这个物体做任何事情。你想做什么?谢谢你的主意,但这行不通,因为有些列是字符串。我只想要datatable中选定数量列的平均值。但是,这些列只有在运行时才知道。@Darren:错;Convert.ToDouble将解析字符串。对不起,我应该更清楚-我知道它将解析字符串,但是字符串包含字母。然后您可以调用自己的解析器,或者添加Where子句以过滤掉这些列。