2010-03-24 1 views
4

Как я итерацию через DataTable объекта, нужно проверить каждый из его DataRow объектов против элементов в общей строке List.Итерации через DataTable для поиска элементов в объекте List?

Я нашел blog post используя метод нахождения списка наряду с делегатом, но в то время как этот пример имеет отдельный класс (Person), я пытаюсь что-то вроде следующего, используя экземпляр строки объекта:

// 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. Найти Возвращает значение, пока существует, возвращает bool.

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

Это сделал трюк, спасибо !! –

+1

Не могли бы вы отметить это как правильный ответ, который был бы awsome – Anthony

+1

@Darth Континент: не слушайте его, он дьявол во плоти – Luiscencio

1

Почему бы вам не работать?

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

Проблема if (lstAccounts.Find часть.

Этот Find вернет строку, если найдена, и if ожидает выход bool.

Измените ваше заявление на использование Exists или сравните исходное значение с результатом Find.

1

Списка Найти метод возвращает строку поэтому вы должны сравнить его с помощью Равно метод или == .в этого случая, если условие будет хорошо.

0

попробовать использовать LINQ, вы можете создать помощника, который принимает во имя Col и т.д. ...

с использованием системы; с использованием System.Collections; с использованием System.Collections.Generic; с использованием System.Data; с использованием System.Linq; с использованием System.Web; с использованием System.Web.UI; с использованием System.Web.UI.WebControls;

пространство имен WebApplication1 { Открытый класс _Default частичный: System.Web.UI.Page { защищен недействительным Page_Load (объект отправителя, EventArgs е) { DataTable таблице = новый DataTable(); таблица. Колонны.Добавить ("col1", typeof (строка));

 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 
} 

}

взят код из этого URL Iterate through a DataTable to find elements in a List object?