遍历 DataTable 查找 List 对象中的元素?

6
当我遍历DataTable对象时,我需要检查其中每个DataRow对象是否与通用字符串List中的项目匹配。我发现一个博客文章使用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();
    }
}

然而,使用这个语法,我收到了“无法将类型'string'隐式转换为'bool'”的错误信息,用于if块。
请问有人能够澄清我做错了什么以及如何最好地完成我想要做的事情吗?
5个回答

3

相同的委托不同的方法。 您想使用Exists而不是Find。 Find返回一个值,而exists返回一个布尔值。

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

1
你能把这个标记为正确答案吗?那将非常棒。 - Anthony
1
@黑武士大陆:不要听他的,他是化身为恶魔的人。 - Luiscencio
1
根据你的个人资料@"SO give me back my rep",你是邪恶的,而不是我。 - Anthony

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

Find 方法返回一个 字符串,因此您应该使用 Equals 方法或 == 进行比较。在这种情况下,if 条件将是正确的。


0

试着使用LINQ,你可以创建一个帮助器,接受列名等参数...

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

namespace 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
}

}

从此URL获取代码 如何遍历DataTable以查找List对象中的元素?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接