0

我想编写一个函数“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

}

但是在 Convert 语句中出现错误:

无法将“d__3a`1[System.String]”类型的对象转换为“System.IConvertible”类型。

问题是什么?谢谢

4

1 回答 1

7

如果您想获得单个项目,而不是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>方法不执行类型转换。

于 2013-06-10T16:46:38.623 回答