2011-02-11 33 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"]; 

還是我錯過了什麼?