繁体   English   中英

将列名和数据从数据表添加到字典? C#

[英]Add columnname and data from datatable to a dictionary? C#

我正在遍历数据表,目前正在

string customerId = row["CustomerId"].ToString();
string companyName = row["Company Name"].ToString();

而不是声明每个变量如何将其添加到字典中? 我在想类似的东西:

foreach (DataRow row in customerTbl.Rows)
    {
     Dictionary<string, string> customerDictionary = new Dictionary<string, string>();
     customerDictionary.Add(row[].ToString(), row[].ToString());

是的,我如何获得行名和值?

提前致谢。

编辑:

我想我没有为您提供有关我要做什么的所有信息。 我查询一个客户数据库,并填充一个约有50列的数据表,我使用客户ID查询另一个数据库,并从那里获取同一客户。 然后,我想比较两个数据库中同一客户的所有50个字段,并检查是否有其他字段不同。 我以为我可以在字典中为每位客户的每一行添加具有列值的列名,然后通过两个循环检查同一键(列名)的值是否不同,这是完全错误的方法吗?

对于50个字段使用if(customerId1!= customerId2 || customerName1!= customerName2 ||依此类推不是很好。

您是否正在寻找这种事情的通用解决方案? 如果是这样,您的DataTable是否总是包含2列,其中第一列可以视为字典键,第二列可以作为值? 如果是这样,则只需使用列索引而不是列名

var customerDictionary = new Dictionary<string, string>();    
foreach (DataRow row in customerTbl.Rows)
   customerDictionary.Add(row[0].ToString(), row[1].ToString());

如果customerId和CompanyName列中的值永远不会为null,则可以将这些值强制转换为字符串,而不必使用ToString()。

customerDictionary.Add((string)row[0], (string)row[1]);

仅供参考,DataTable也具有搜索功能(Find()方法)。 如果设置主键列,则搜索将非常快,并且可能不需要将数据从DataTable复制到Dictionary。

编辑:根据OP编辑的问题,使用C#代码完成此操作的一种方法的完整工作示例

  class Program
  {
    static void Main(string[] args)
    {
      var table1 = GetCustomersFromFirst();
      var table2 = GetCustomersFromSecond();

      foreach (DataRow row in table1.Rows)
      {
        var foundRows = table2.Select("CustomerId = " + (string)row[0]);
        if (foundRows.Length == 1)
        {
          var foundRow = foundRows[0];
          foreach (DataColumn col in table1.Columns)
          {
            var valueOfColumnFromTable1 = row[col.Ordinal].ToString();
            var valueOfColumnFromTable2 = foundRow[col.Ordinal].ToString();
            if (String.Compare(valueOfColumnFromTable1, valueOfColumnFromTable2) != 0)
            {
              //the colum values are not the same.
            }

          }
        }
        else
        {
          // Something is wrong since more than one matching record was found
          // or no matching records were found.
        }
      }
    }

    static DataTable GetCustomersFromFirst()
    {
      var dt = GetInitializedCustomerDataTable();
      var row = dt.NewRow();
      row[0] = "1";
      row[1] = "CompanyA";
      dt.Rows.Add(row);

      row = dt.NewRow();
      row[0] = "2";
      row[1] = "CompanyB";
      dt.Rows.Add(row);

      row = dt.NewRow();
      row[0] = "3";
      row[1] = "CompanyC";
      dt.Rows.Add(row);

      return dt;
    }

    static DataTable GetCustomersFromSecond()
    {
      var dt = GetInitializedCustomerDataTable();
      var row = dt.NewRow();
      row[0] = "1";
      row[1] = "CompanyA";
      dt.Rows.Add(row);

      row = dt.NewRow();
      row[0] = "2";
      row[1] = "CompanyD";
      dt.Rows.Add(row);

      row = dt.NewRow();
      row[0] = "3";
      row[1] = "CompanyC";
      dt.Rows.Add(row);

      return dt;
    }

    static DataTable GetInitializedCustomerDataTable()
    {
      var dt = new DataTable();
      dt.Columns.Add("CustomerId", typeof(string));
      dt.Columns.Add("CompanyName", typeof(string));
      return dt;
    }
  }

在测试数据中,第二行不匹配。 因此,它应该落入注释中的条件://列值不相同。

就个人而言,我将在数据库本身中进行此操作。

尝试这个。

Dictionary<string, string> customerDictionary = new Dictionary<string, string>();
foreach (DataRow row in customerTbl.Rows)
{         
     if(row["CustomerId"] != null && customerDictionay.ContainsKey("CustomerId") == false)
     {
         customerDictionary.Add(row["CustomerID"].ToString(), row["CompanyName"] as string);
     }
}

只是一个问题,将值放入字典有什么好处? 您基本上只是在访问值时消除了编写.ToString()的需要...即,而不是:

row["CustomerID"].ToString();

你写

customerDictionary["CustomerID"];

还是我错过了什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM