2011-02-11 9 views
1

私はデータテーブルをループしています。現在、私はデータテーブルの列名とデータを辞書に追加しますか? 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()); 

そうええ、どのように私はそこに行の名前と値を得るのですか?

ありがとうございます。

EDIT:

私はあなたに私が何をしようとしていますかについてのすべての情報を与えていないと思います。 私は顧客のためにデータベースを照会し、約50列のデータテーブルを作成します。顧客IDを使用して別のデータベースを照会し、そこから同じ顧客を取得します。私は同じ顧客の両方のデータベースから50のフィールドをすべて比較し、フィールドが異なるかどうかを確認したいと思います。私は、顧客ごとに各行の辞書に値を持つ列名を追加して、2つのループで同じキー(列名)の値が異なるかどうかを確認することができたと思っています。

場合(customerId1!= customerId2 || customerName1!= customerName2 ||を持つなど50の分野については非常に良いではありません。

+0

その辞書の意図する「キー」は何ですか? –

+0

@Marc、私はCustomerIdを推測しています –

+0

この行 '辞書 customerDictionary =新しい辞書();は' for'ループIMOの前に置かなければなりません。 – shahkalpesh

答えて

2

あなたが探していますもしそうなら、あなたのDataTableには常に2つの列があります。最初の列を辞書のキーとして扱い、2番目の列の値を列の名前の代わりに使用します。

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

はcustomerIdや仕入列の値ではなく、toString()を使用してのヌルされることはありませんならば、あなたはFYI文字列

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

これを行う1つの方法の完全な実施例では、2行目が一致しません。したがって、コメントには次のような条件が含まれます: //列の値は同じではありません。

個人的には、データベース自体でこれを行うことにします。

+0

こんにちは、私は少し質問を更新しました。 – Nick

+0

私はDataTablesの使用に固執します。 1つのDataTable行を繰り返し、2番目のDataTableで一致するレコードを「検索()」します。次に、両方の列のすべてを繰り返してチェックします。ここでは、両方のDataTableの列が同じ順序であることを前提としています。 –

+0

@Nick、私はあなたがこれを行う方法の実例を含めるために私の答えを更新しました。 –

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

あなたは辞書変数*をループ外に宣言したいかもしれません。 =) –

+0

@J。 Steen Thanks fixed it – Adeel

0

ちょうど質問ですが、値を辞書に入れるのはなぜですか?基本的には、値にアクセスするときに.ToString()を書く必要がなくなります。E、代わりに:

row["CustomerID"].ToString(); 

あなたは

customerDictionary["CustomerID"]; 

を書いたり、私が何かを見逃していますか?

+0

辞書はルックアップのために最適化されています - したがって、名前は "Dictionary"です。 =)また、彼はビジネスロジックの階層の上にDataTableを送信したくないかもしれません。 –

関連する問題