在所有DataTable列中查找字符串

我试图找到一种快速的方法来在所有数据表列中找到一个字符串! 随后没有工作,因为我想在所有列值内搜索。

string str = "%whatever%"; foreach (DataRow row in dataTable.Rows) foreach (DataColumn col in row.ItemArray) if (row[col].ToString() == str) return true; 

这可以通过过滤来实现。 根据所有列创建(可重用)过滤字符串:

  bool UseContains = false; int colCount = MyDataTable.Columns.Count; string likeStatement = (UseContains) ? " Like '%{0}%'" : " Like '{0}%'"; for (int i = 0; i < colCount; i++) { string colName = MyDataTable.Columns[i].ColumnName; query.Append(string.Concat("Convert(", colName, ", 'System.String')", likeStatement)); if (i != colCount - 1) query.Append(" OR "); } filterString = query.ToString(); 

现在,您可以获取其中一列与searchstring匹配的行:

  string currFilter = string.Format(filterString, searchText); DataRow[] tmpRows = MyDataTable.Select(currFilter, somethingToOrderBy); 

您可以使用LINQ。 它不会更快,因为你仍然需要查看每个单元格,以防值不存在,但它将适合一行:

 return dataTable .Rows .Cast() .Any(r => r.ItemArray.Any(c => c.ToString().Contains("whatever"))); 

要搜索随机文本并返回至少一个具有不区分大小写匹配的单元格的行数组,请使用以下命令:

 var text = "whatever"; return dataTable .Rows .Cast() .Where(r => r.ItemArray.Any( c => c.ToString().IndexOf(text, StringComparison.OrdinalIgnoreCase) > 0 )).ToArray(); 

如果你想检查数据表中每一列的每一行,试试这个(它对我有用!)。

 DataTable YourTable = new DataTable(); // Fill your DataTable here with whatever you've got. foreach (DataRow row in YourTable.Rows) { foreach (object item in row.ItemArray) { //Do what ya gotta do with that information here! } } 

不要忘记将object item强制转换为您需要的任何东西(字符串,整数等)。

我已经完成了调试器,它的function很有魅力。 我希望这个帮助能祝你好运!

您可以使用包含列名称的字符串数组创建搜索例程:

 string[] elems = {"GUID", "CODE", "NAME", "DESCRIPTION"};//Names of the columns foreach(string column in elems) { string expression = string.Format("{0} like '%{1}%'",column, txtSearch.Text.Trim());//Search Expression DataRow[] row = data.Select(expression); if(row.Length > 0) { // Some code here } else { // Other code here } } 

您也可以在数据表上创建filter表达式。 请参阅此MSDN 文章 。 在filter表达式中使用like。

  string filterExp = "Status = 'Active'"; string sortExp = "City"; DataRow[] drarray; drarray = dataSet1.Customers.Select(filterExp, sortExp, DataViewRowState.CurrentRows); for (int i=0; i < drarray.Length; i++) { listBox1.Items.Add(drarray[i]["City"].ToString()); }