【问题标题】:Unable to retrieve Dictionary value when used in LINQ在 LINQ 中使用时无法检索字典值
【发布时间】:2013-05-15 20:57:46
【问题描述】:

我正在尝试根据数据表中的“ID”数据列更新“名称”数据列。 'ID'-'Name' 对存储在 Dictionary 中,它是使用 DataTable 扩展方法创建的,如下所示:

public static Dictionary<object, object> ToDictionary(this DataTable dataTable, string keyColumn, string valueColumn)
    {
        Dictionary<object, object> resultDict = new Dictionary<object, object>();

        if (dataTable.Columns.Contains(keyColumn) && dataTable.Columns.Contains(valueColumn))
        {
            foreach (DataRow dr in dataTable.Rows)
                if (resultDict.ContainsKey(dr[keyColumn]) == false)
                    resultDict.Add(dr[keyColumn], dr[valueColumn]);
        }

        return resultDict;
    }

我正在使用以下 LINQ 语法来更新 DataColumn:

misUserDetailsDT.AsEnumerable().ToList().ForEach(row => row.SetField("DepartmentName", deptDict[row["DepartmentID"]].ToString()));

这里的“misUserDetailsDT”是包含填充列“DepartmentID”和空列“DepartmentName”的 DataTable - 我正在尝试更新。

我有一个单独的方法生成字典如下:

var deptDict = departmentDT.ToDictionary("DeptID", "DeptName");

其中“departmentDT”是包含“DeptID”和“DeptName”列的 DataTable。

现在,当我执行 Linq 代码时,它会给出“KeyNotFoundException”。我已经彻底检查了“departmentDT”表以及“deptDict”是否具有“misUserDetailsDT”表中的所有键(departmentID)。实际上,“departmentDT”本身是由“misUserDetailsDT”表的所有不同 ID 生成的。

我认为找出正确类型的 Dictionary 键存在一些问题。我什至尝试将其转换为 Int16,但没有成功。 请帮我找出解决方案。

【问题讨论】:

  • misUserDetailsDT.AsEnumerable().ToList().ForEach(row =&gt; row.SetField 效率极低。你有一个内存对象,一个DataTable。然后使用ToList 创建另一个内存对象,一个几乎相同的List&lt;DataRow&gt;。唯一的原因是您想使用List.ForEach。为什么不首先在DataTable.Rows 上使用foreach
  • 这是一条非常有用的信息@TimSchmelter。我一定会根据您的提示更改实施。但是,我想了解为什么我的实现不起作用?

标签: linq dictionary extension-methods var


【解决方案1】:

我已经找到了问题所在。当字典值转换为 Int32 时,该代码有效。感谢@TimSchmelter 提供了非常有用的信息。我将更改代码以使用 foreach 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多