将DataTable转换为字典C#

Max*_*mus 31 c# linq datatable dictionary enumerable

我想知道如何将DataTable转换为Dictionary.我做了这样的事.

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));
}
Run Code Online (Sandbox Code Playgroud)

但我得到:

System.Data.EnumerableRowCollection不包含'ToDictionary'的定义和最佳扩展方法重载'System.Linq.Parallel.Enumerable.ToDictionary(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComrparer)'有一些无效的争论

我该如何解决这个问题?

谢谢

cad*_*ll0 72

通用方法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));
}
Run Code Online (Sandbox Code Playgroud)

当然,如果你把它们关掉,编译器就能推断出类型,所以你不会得到错误.


Par*_*Par 14

所有普遍的答案都没有帮助我,所以我这样做了:

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

它工作得很好!


Kev*_*vin 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));
}
Run Code Online (Sandbox Code Playgroud)


Yak*_*nor 6

我更喜欢这种方法:

public static List<Dictionary<string, string>> GetDataTableDictionaryList(DataTable dt)
{
    return dt.AsEnumerable().Select(
        row => dt.Columns.Cast<DataColumn>().ToDictionary(
            column => column.ColumnName,
            column => row[column].ToString()
        )).ToList();
}
Run Code Online (Sandbox Code Playgroud)

原因是因为此代码还可以通过调用ToString方法来处理布尔值或其他数据类型。

请注意,这将返回字典列表,如果每行都有键,则可以将其修改为字典字典。

遍历布尔列可能看起来像这样:

var list = GetDataTableDictionaryList(dt);

foreach (var row in list)
{
    if (row["Selected"].Equals("true", StringComparison.OrdinalIgnoreCase))
    {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)