【问题标题】:C# - 2 DataTable columns to Dictionary - Distinct ValueC# - 2个数据表列到字典 - 不同的值
【发布时间】:2017-08-16 20:13:26
【问题描述】:

我有一个文本文件列表,我正在阅读每个文件,并在拆分选项的帮助下创建一个包含 5 列(无 ID)的数据表(名称:tbl)。

此外,创建一个只有 Column1 和 Column5 的数据表并将其转换为字典,因为 column1 将是键,column5 将是它的值。

以下是代码:

        string[] selectedColumns = new[] { "Column1", "Column5" };
        DataTable dt = new DataView(tbl).ToTable(false, selectedColumns);

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

错误: $exception {"已添加具有相同键的项目。"} System.Exception {System.ArgumentException}

由于重复而出现的错误。

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

结果相同。

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

引发错误: 错误 1 ​​无法将类型“System.Collections.Generic.IEnumerable>”隐式转换为“System.Collections.Generic.Dictionary”。存在显式转换(您是否缺少演员表?)

如何避免重复并仅将不同的值放入字典字典中?

提前致谢。

【问题讨论】:

  • 您是否保证第 1 列中的给定值在第 5 列中始终具有相同的值?

标签: c# dictionary datatable


【解决方案1】:

由于错误状态,您需要将其转换为Dictionary

试试这个

            dict = dt.AsEnumerable().Select(row => new
            {
                attribute1_name = row.Field<string>(selectedColumns[0]),
                attribute2_name = row.Field<string>(selectedColumns[1])
            }).Distinct().ToDictionary(s => s.attribute1_name, s => s.attribute2_name);

【讨论】:

  • 给出同样的错误。 {“已添加具有相同键的项目。”} System.Exception {System.ArgumentException}
  • 这无济于事,因为您在去重之前创建了一个字典,所以您仍然会遇到重复条目的问题。您需要在第一次调用 ToDictionary 之前获取不同的值。
  • @Tango 已编辑答案,请立即查看
  • 完美运行。我的解决方案版本dt = dt.AsEnumerable().GroupBy(r=&gt;new {Col1 = r["Column1"]}).Select(r=&gt;r.First())); tDT = dt.AsEnumerable().GroupBy(r =&gt; r.Field&lt;string&gt;("Column1")).Select(g =&gt; g.First()).CopyToDataTable(); dict = tDT.AsEnumerable().ToDictionary&lt;DataRow, string, string&gt;(row =&gt; row[0].ToString(), row =&gt; row[1].ToString());
【解决方案2】:

也许你可以尝试这样的事情:

 dict = dt.AsEnumerable().GroupBy(x=> x.<yourColumnName>)
  .Select(group => group.First());

然后加载到字典中。

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多