检查dataTable中是否存在值?


91

我有带有两列AuthorBookname的DataTable 。

我想检查给定的字符串值Author是否已存在于DataTable中。是否有一些内置的方法来检查它,例如Arrays array.contains


8
LINQ?table.Any(t => t.Author == author);
达维奥

Answers:


206

你可以用LINQ-to-DataSetEnumerable.Any

String author = "John Grisham";
bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));

另一种方法是使用DataTable.Select

DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'");
if(foundAuthors.Length != 0)
{
    // do something...
}

问:如果我们不知道标题列,又想查找行PEPSIc列中是否存在任何单元格值,该怎么办?我可以循环查找所有内容,但是有更好的方法吗?–

是的,您可以使用以下查询:

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));

将它们添加System.Data.DataSetExtensions到参考中并using System.Linq;使用类
5377037 '17

在这两种解决方案中,哪一个更快?
保罗·亚历山大

1
@PaulAlexander:没有太大的区别。但是旧的DataTable.Select语法是有限的,而LINQ可以使用完整的.NET框架或自定义方法。因此,只有当您坚持使用.NET 2时,才应使用DataTable.Select,否则我总是会更喜欢LINQ
Tim Schmelter

如果您关心性能并拥有庞大的数据集,tbl.Select()则比其他方法要快得多。
HerrimanCoder

@TimSchmelter-大蒂姆。但是,如果用户不知道列名,但仍想获取与搜索值匹配的所有行,该怎么做?
Chandan Kumar

13

您可以使用Linq。就像是:

bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;

8
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}

添加到您的using子句:

using System.Linq;

并添加:

System.Data.DataSetExtensions

参考。


5

您应该能够使用DataTable.Select()方法。您可以像这样给我们。

if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0)
    ...

Select()函数返回一个DataRows数组,用于匹配where语句的结果。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.