gpt4 book ai didi

c# - 将类型作为参数传递给 LINQ Field 方法

转载 作者:太空狗 更新时间:2023-10-30 01:36:20 24 4
gpt4 key购买 nike

下面我们有一个用于模拟数据库调用的列表和一个获取该列表并将其转换为 DataTable 的小程序。在此示例中,我使用列名称的变量来访问该列的值并获取平均值。但是,我调用了 Field 方法并将其指定为 int 类型。似乎无法将变量传递给通用 Field 方法。有没有另一种方法可以访问 DataTable 的列值并返回类似于平均值的值,而在运行时之前不知道列的类型?

 public class Icd
{
public int ConditionCode { get; set; }
public string ConditionName { get; set; }

public static List<Icd> GetIcdList()
{
return new List<Icd>()
{
new Icd() { ConditionCode = 111, ConditionName = "Condition 1" },
new Icd() { ConditionCode = 222, ConditionName = "Condition 2" },
};
}
}
var icdList = Icd.GetIcdList();
var columnName = "ConditionCode";
DataTable dt = new DataTable();

dt = icdList.ToList().ListToDataTable();
var avg = dt.AsEnumerable().Where(x => x[columnName] != DBNull.Value)
//possible to pass a variable to the field method?
.Average(x => x.Field<int>(columnName));
Console.WriteLine(avg); //<-- correct answer

更新:我尝试添加:

Type t = typeof(int)

x => x.Field<t>(columnName)

但这给了我错误:

The type or namespace 't' could not be found

ListToDataTable 辅助方法:

public static DataTable ListToDataTable<T>(this IList<T> data)
{
DataTable dt = new DataTable();
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
for (int i = 0; i < props.Count; i++)
{
PropertyDescriptor prop = props[i];
dt.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T t in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(t);
}
dt.Rows.Add(values);
}
return dt;
}

最佳答案

我想你可以在这里使用 dynamic 类型。

例如:

var avg = dt.AsEnumerable().Where(x => x[columnName] != DBNull.Value)
//possible to pass a variable to the field method?
.Average(x => x.Field<dynamic>(columnName));

我已经做了最少的测试,而且它似乎有效。欢迎其他人对此发表评论。

干杯

关于c# - 将类型作为参数传递给 LINQ Field 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22515483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com