Перебирать DataTable, чтобы найти элементы в объекте List?

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

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

// 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();
    }
}

Однако с этим синтаксисом я получаю «Невозможно неявно преобразовать тип« строка »в« логическое значение »» для блока if.

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


person Darth Continent    schedule 24.03.2010    source источник


Ответы (5)


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

if (lstAccounts.Exists(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; })
person Anthony    schedule 24.03.2010
comment
Не могли бы вы отметить это как правильный ответ, это было бы круто - person Anthony; 24.03.2010
comment
@Darth Continent: не слушай его, он дьявол во плоти - person Luiscencio; 24.03.2010
comment
Судя по твоему профилю @SO, верни мне мою репутацию, ты злой, а не я. - person Anthony; 24.03.2010

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

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

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

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

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

person Kelsey    schedule 24.03.2010

Метод списка Найти возвращает строку, поэтому ее следует сравнить с помощью метода Equals или ==. В этом случае условие if будет в порядке.

person wonde    schedule 24.03.2010

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

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

пространство имен WebApplication1 { общедоступный частичный класс _Default: System.Web.UI.Page { protected void Page_Load (отправитель объекта, EventArgs e) { Таблица DataTable = 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-адреса найти элементы в объекте List?

person Deanvr    schedule 24.03.2010