我想编写一个函数“getCount”来为数据表中的不同用户名返回int的结果,如下所示:
static void Main(string[] args)
{
DataTable table = new DataTable();
table.Columns.Add("username", typeof(string));
table.Columns.Add("count", typeof(int));
table.Columns.Add("code", typeof(string));
table.Rows.Add("Peter", 300, "wer");
table.Rows.Add("Peter", 299, "sdf");
table.Rows.Add("Peter", 298, "34d");
table.Rows.Add("Peter", 297, "4ed");
table.Rows.Add("Paul", 200, "1vc");
table.Rows.Add("Paul", 200, "64f");
table.Rows.Add("Paul", 200, "45d");
table.Rows.Add("Paul", 200, "dcd");
//expectedly 300, i.e. the first row of count column for peter
int x1 = getCount(table, "Peter");
//expectedly 200, i.e. the first row of count column for paul
int x2 = getCount(table, "Paul");
}
static int getCount(DataTable dt, string name)
{
var query = dt.AsEnumerable().Where(p => p.Field<string>("username") == name)
.Select(p => p.Field<string>("count")).Take(1);
return Convert.ToInt32(query); //error here
}
但转换法规中出现错误:
无法将'd__3a`1 [System.String]'类型的对象强制转换为'System.IConvertible'。
有什么问题? THX
答案 0 :(得分:6)
如果您想获得单件商品,请使用Take(1)
而不是FirstOrDefault()
。目前,您的查询的类型为IEnumerable<string>
,无法转换为Int32
。
同样使用Field<int>
而不是尝试获取字符串并手动将其转换为整数,因为您的列实际存储了整数值:
static int getCount(DataTable dt, string name)
{
return dt.AsEnumerable()
.Where(p => p.Field<string>("username") == name)
.Select(p => p.Field<int>("count"))
.FirstOrDefault();
}
实际上,如果您尝试将整数字段值转换为字符串,则会收到错误,因为Field<T>
方法不执行类型转换。