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

时间:2011-02-11 06:50:07

标签: 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 ||等等)不是很好。

3 个答案:

答案 0 :(得分:2)

您是否在寻找通用的解决方案?如果是这样,您的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复制到字典。

编辑:根据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;
    }
  }

在测试数据中,第2行不匹配。所以它应该落入评论所说的条件: //列的值不一样。

就个人而言,我会考虑在数据库本身中这样做。

答案 1 :(得分:1)

试试这个。

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);
     }
}

答案 2 :(得分:0)

只是一个问题,将值放入字典有什么好处?您基本上只是在访问值时无需编写.ToString(),即代替:

row["CustomerID"].ToString();
你写了

customerDictionary["CustomerID"];

或者我错过了什么?