2010-03-24 40 views
4

當我通過的DataTable對象迭代,我需要檢查它的每一個的DataRow對項目對象的一個​​通用的字符串列表迭代通過DataTable查找List對象中的元素?

我發現了一個blog post使用列表的查找方法與代表一起,但而這個例子有一個單獨的類(人),我試圖像在使用串的實例如下對象:

// My definition of the List object. 
List<string> lstAccountNumbers = new List<string>(); 
... 

// I populate the List via its Add method. 
... 

foreach (DataRow drCurrentRow in dtMyDataTable.Rows) 
{ 
    if (lstAccounts.Find(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; }) 
    { 
     Found_DoSomething(); 
    } 
    else 
    { 
     NotFound_DoSomethingElse(); 
    } 
} 

但是,對於如果塊,我接收到「不能隱式轉換類型'字符串爲'bool'」。

有人可以澄清我做錯了什麼,以及如何最好地完成我想要做的事情?

回答

3

相同的代表不同的方法。 您想使用Exists Not Find。 查找返回一個值,而存在則返回一個布爾值。

if (lstAccounts.Exists(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; }) 
+0

這並獲得成功,感謝

採取代碼! – 2010-03-24 17:49:56

+1

你能把這個標記爲正確的答案嗎?那將是一個很難的 – Anthony 2010-03-24 18:04:49

+1

@Darth大陸:不要聽他說他是肉身的惡魔 – Luiscencio 2010-03-24 18:05:43

1

爲什麼這不適合你?

foreach (DataRow drCurrentRow in dtMyDataTable.Rows) 
{ 
    if (lstAccounts.Contains(drCurrentRow["AccountNumber"].ToString())) 
    { 
     Found_DoSomething(); 
    } 
    else 
    { 
     NotFound_DoSomethingElse(); 
    } 
} 
1

問題是if (lstAccounts.Find部分。

Find將返回一個字符串,如果找到和if預計布爾輸出。

更改您的聲明以使用Exists或將您的原始值與Find結果進行比較。

1

名單查找方法返回一個字符串所以你應該使用的Equals方法或==。在這種情況下,如果條件將被罰款相比較。

0

嘗試使用linq,你可以創建一個助手,它需要col名等等......

using System;使用System.Collections的 ; using System.Collections.Generic; using System.Data;使用System.Linq的 ; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;

命名空間WebApplication1 { 公共部分類_Default:System.Web.UI.Page { 保護無效的Page_Load(對象發件人,EventArgs的) { 數據表表=新數據表(); table.Columns。添加(「col1」,typeof(string));

 DataRow row; 
     row = table.NewRow(); 
     row["col1"] = "123"; 
     table.Rows.Add(row); 
     row = table.NewRow(); 
     row["col1"] = "456"; 
     table.Rows.Add(row); 

     LinqList<DataRow> rows = new LinqList<DataRow>(table.Rows); 
     // do a simple select 
     DataRow [] selectedRows = (from r in rows where (string)r["col1"] == "123" select r).ToArray(); 

     if(selectedRows.Length > 0) 
     { 
      lable1.Text = "success"; 
     } 
     else 
     { 
      lable1.Text = "failed"; 
     } 
    } 
} 


// simple wrapper that implements IEnumerable<T> 
internal class LinqList<T> : IEnumerable<T>, IEnumerable 
{ 
    IEnumerable items; 

    internal LinqList(IEnumerable items) 
    { 
     this.items = items; 
    } 

    #region IEnumerable<DataRow> Members 
    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { 
     foreach (T item in items) 
      yield return item; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     IEnumerable<T> ie = this; 
     return ie.GetEnumerator(); 
    } 
    #endregion 
} 

}該網址 Iterate through a DataTable to find elements in a List object?