0

次のように、データテーブルからさまざまなユーザー名の int の結果を返す関数「getCount」を書きたいと思います。

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 に答える