2013-10-31 17 views
24

DataTableを辞書に変換する方法を知りたい。私はこのようなことをしました。DataTableを辞書Cに変換する#

using System.Linq; 

internal Dictionary<string,object> GetDict(DataTable dt) 
{ 
    return dt.AsEnumerable() 
     .ToDictionary<string, object>(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 
} 

しかし、私は得る:

System.Data.EnumerableRowCollectionは 'ToDictionary' と最高の拡張メソッドのオーバーロード「System.Linq.Parallel.Enumerable.ToDictionary(システムの定義が含まれていません。 Linq.ParallelQuery、System.Func、System.Collections.Generic.IEqualityComrparer) '無効な引数がいくつかあります

どうすれば解決できますか?

ありがとうございました

+0

完全なエラーメッセージを投稿してください。 – cadrell0

+0

私は完全なエラーメッセージ –

答えて

59

汎用メソッドToDictionaryには3つのパラメータがあります。あなたは1人を離したので、何をすべきか分からない。すべてのパラメータを指定する場合は、<DataRow, string, object>になります。

internal Dictionary<string,object> GetDict(DataTable dt) 
{ 
    return dt.AsEnumerable() 
     .ToDictionary<DataRow, string, object>(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 
} 

もちろん、それらをオフにしておくと、コンパイラは型を推論することができるため、エラーは発生しません。

+1

+1、これは主な理由です、[ToDictionary ]の詳細(http://msdn.microsoft.com/en-us/library/bb548657) .aspx) –

1

私は解決策を見いだしましたが、理由はわかりません。私はちょうど...あなたはそれが文字列だったことを通知し、私は私が最初のタイプとしてIEnumberable<T>を期待している。この

internal Dictionary<string, object> GetDict(DataTable dt) 
    { 
     Dictionary<String, Object> dic = dt.AsEnumerable().ToDictionary(row => row.Field<String>(0), row => row.Field<Object>(1)); 
     return dic; 
    } 
+0

を追加しましたが、今は動作します。どのような違いがわからない –

6

ToDictionaryに変更していたことが明確に何をさせるためのコードを完了、私の質問を編集していますそれは私は、これはあなたを助けると思うそれはあなたがタイプを指定することによって、混乱だIEnumerable<DataRow>

だ...これを試してみてください...

internal Dictionary<string,object> GetDict(DataTable dt) 
{ 
    return dt.AsEnumerable() 
     .ToDictionary(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 
} 
1

間違っている:

  DataTable dt = new DataTable(); 
      dt.Columns.Add("Column1"); 
      dt.Columns.Add("Column2"); 
      dt.Rows.Add(1, "first"); 
      dt.Rows.Add(2, "second"); 
      var dictionary = dt.Rows.OfType<DataRow>().ToDictionary(d => d.Field<string>(0), v => v.Field<object>(1)); 
10

すべて&過去の答えは私を助けていなかったので、私はこれをしなかった:

myList = dt.AsEnumerable() 
.ToDictionary<DataRow, string, string>(row => row[0].ToString(), 
             row => row[1].ToString()); 

をし、それは素晴らしい仕事を!

関連する問題