2011-02-11 58 views
1

我通过一个DataTable循环,目前我做将数据表中的列名和数据添加到字典中? 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个字段的同一个客户,并检查是否有任何字段不同。我想我可以为每个客户的每行添加一个字段中的值,然后用两个循环检查同一个键(列名)的值是否不同,这是一个完全错误的方法吗?

具有IF(customerId1!= customerId2 || customerName1!= customerName2 ||等了50场不是很好。

+0

该词典的“关键”是什么? – 2011-02-11 06:57:53

+0

@Marc,我猜客户Id – 2011-02-11 07:11:35

+0

这行`Dictionary customerDictionary = new Dictionary ();`应放在`for`循环之前,IMO。 – shahkalpesh 2011-02-11 07:42:49

回答

2

你正在寻找一个这种类型的东西的通用解决方案?如果是这样,你的DataTable总是包含2列,其中第一个可以被视为字典键,第二个值?如果是这样,那么只需使用列索引而不是列名

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

如果客户id和公司列中的值永远不会为null,则不是使用toString()方法,你可以投的价值观为字符串

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

仅供参考,DataTable中具有搜索能力以及(在Find()方法)。如果设置了主键列,搜索速度将非常快,您可能不需要将数据从DataTable复制到Dictionary。

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

在测试数据的一种方式的完整工作示例,第二排不匹配。所以它应该落入评论所说的条件: //柱面值不一样。

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

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

您可能*想要在循环外部声明字典变量*。 =) – 2011-02-11 11:06:29

0

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

row["CustomerID"].ToString(); 

你写

customerDictionary["CustomerID"]; 

还是我错过了什么?