通过DataTable迭代查找List对象中的元素?

时间:2010-03-24 15:49:44

标签: c# asp.net datatable datarow generic-list

当我遍历 DataTable 对象时,我需要针对通用字符串列表中的项目检查每个 DataRow 对象。

我使用List的Find方法和委托找到了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'”,用于 if 块。

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

5 个答案:

答案 0 :(得分:3)

相同代表不同的方法。 您想使用Exists Not Find。 Find返回一个值,当exists返回一个bool。

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

答案 1 :(得分:1)

为什么这不适合你?

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

答案 2 :(得分:1)

问题是if (lstAccounts.Find部分。

如果找到此Find将返回一个字符串,if正在等待bool输出。

将您的对帐单更改为使用Exists或将原始值与Find结果进行比较。

答案 3 :(得分:1)

列表查找方法会返回字符串,因此您应该使用等于方法或 == 进行比较。在这种情况下,if条件没问题。

答案 4 :(得分:0)

尝试使用linq,你可以创建一个包含col name等的帮助器......

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

命名空间WebApplication1 {     public partial class _Default:System.Web.UI.Page     {         protected void Page_Load(object sender,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
}

}

从此网址获取代码 Iterate through a DataTable to find elements in a List object?