2013-10-31 1026 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)”有一些无效argumentsch

我怎样才能解决这个问题?

谢谢

+0

请发布完整的错误信息。 – cadrell0

+0

我添加了完整的错误消息 –

回答

59

通用方法ToDictionary有3个参数。你离开了一个,所以它不知道该怎么做。如果你想指定所有的参数,它将是<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/zh-cn/library/bb548657的.aspx) –

1

我找到了解决方案,但不知道为什么。我编辑我的问题完成的代码只是为了说清楚我在做什么的我改变了这个

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期待的IEnumberable<T>为第一型......你告诉它,这是一个字符串,错了,它是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

所有previos回答没有帮助我,所以我这样做:

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

和它的工作太棒了!