Итерировать через DataTable, чтобы найти элементы в объекте List? - PullRequest
5 голосов
/ 24 марта 2010

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

Я нашел сообщение в блоге , используя метод List для Find вместе с делегатом, но, хотя в этом примере есть отдельный класс (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 »» для блока , если .

Может кто-нибудь объяснить, что я делаю неправильно и как лучше всего выполнить то, что я пытаюсь сделать?

Ответы [ 5 ]

3 голосов
/ 24 марта 2010

Тот же делегат Другой метод. Вы хотите использовать Exists Not Find. Find Возвращает значение, пока существует, возвращает bool.

if (lstAccounts.Exists(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; })
1 голос
/ 24 марта 2010

Список Find метод возвращает string , поэтому вы должны сравнить его, используя Equals method или == . В этом случае если условие будет в порядке.

1 голос
/ 24 марта 2010

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

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

Измените ваше утверждение, чтобы использовать Exists или сравните свое первоначальное значение с результатом Find.

1 голос
/ 24 марта 2010

почему бы не работать для вас?

foreach (DataRow drCurrentRow in dtMyDataTable.Rows) 
{
    if (lstAccounts.Contains(drCurrentRow["AccountNumber"].ToString()))
    {
        Found_DoSomething();
    }
    else
    {
        NotFound_DoSomethingElse();
    }
}
0 голосов
/ 24 марта 2010

попробуйте с помощью linq, вы можете создать помощника, который принимает имя col и т. Д.

с использованием системы; использование System.Collections; using 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 e) { DataTable table = new DataTable (); table.Columns.Add ("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
}

}

взят код с этого URL Итерация по DataTable для поиска элементов в объекте List?

...