我有带有两列Author和Bookname的DataTable 。
我想检查给定的字符串值Author是否已存在于DataTable中。是否有一些内置的方法来检查它,例如Arrays array.contains
?
Answers:
你可以用LINQ-to-DataSet
与Enumerable.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...
}
问:如果我们不知道标题列,又想查找行
PEPSI
c列中是否存在任何单元格值,该怎么办?我可以循环查找所有内容,但是有更好的方法吗?–
是的,您可以使用以下查询:
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;
使用类
DataTable.Select
语法是有限的,而LINQ可以使用完整的.NET框架或自定义方法。因此,只有当您坚持使用.NET 2时,才应使用DataTable.Select
,否则我总是会更喜欢LINQ
tbl.Select()
则比其他方法要快得多。
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}
添加到您的using子句:
using System.Linq;
并添加:
System.Data.DataSetExtensions
参考。
您应该能够使用DataTable.Select()方法。您可以像这样给我们。
if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0)
...
Select()函数返回一个DataRows数组,用于匹配where语句的结果。
您可以将数据库设置为IEnumberable并使用linq来检查值是否存在。查看此链接
给出的例子是
var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...
你可以在任何地方补充
table.Any(t => t.Author == author);