C# 在所有DataTable列中查找字符串

C# 在所有DataTable列中查找字符串,c#,foreach,datatable,C#,Foreach,Datatable,我正在试图找到一种快速的方法来在所有datatable列中查找字符串! followered不起作用,因为我希望在所有列中搜索值 string str = "%whatever%"; foreach (DataRow row in dataTable.Rows) foreach (DataColumn col in row.ItemArray) if (row[col].ToString() == str) return true; 您可以使用LINQ。它不会更快,因为

我正在试图找到一种快速的方法来在所有datatable列中查找字符串! followered不起作用,因为我希望在所有列中搜索值

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

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

return dataTable
    .Rows
    .Cast<DataRow>()
    .Any(r => r.ItemArray.Any(c => c.ToString().Contains("whatever")));
返回数据表
.行
.Cast()
.Any(r=>r.ItemArray.Any(c=>c.ToString().Contains(“whatever”));
要搜索随机文本并返回至少有一个单元格不区分大小写匹配的行数组,请使用以下命令:

var text = "whatever";
return dataTable
    .Rows
    .Cast<DataRow>()
    .Where(r => r.ItemArray.Any(
        c => c.ToString().IndexOf(text, StringComparison.OrdinalIgnoreCase) > 0
    )).ToArray();
var text=“无论什么”;
返回数据表
.行
.Cast()
.Where(r=>r.ItemArray.Any(
c=>c.ToString().IndexOf(text,StringComparison.OrdinalIgnoreCase)>0
)).ToArray();

您也可以在datatable上创建筛选器表达式。请参阅此MSDN。在过滤器表达式中使用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());
 }
string filterExp=“状态='Active'”;
字符串xp=“城市”;
数据行[]drarray;
drarray=dataSet1.Customers.Select(filterExp、sortExp、DataViewRowState.CurrentRows);
for(int i=0;i
如果要检查数据表中每一列的每一行,请尝试此方法(它对我有用!)

不要忘记将
对象项
键入您需要的任何内容(字符串、int等)


我已经使用了调试器,它很有魅力。我希望这有帮助,祝你好运

这可以通过过滤来实现。基于所有列创建(可重用)筛选字符串:

        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();

您可以创建一个带有列名称的字符串数组的搜索例程,以及:

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

您试图做什么?在所有datatable单元格中搜索字符串,但我想使用LIKE子句并以更快的方式!在数据库中执行-@web_bod,谢谢,此脚本将在内存中的[unknown]datatable上运行,因此,我不知道列,也不知道数据引擎!我想你可以用plinq加快速度,只需在querytanks@dasblinkenlight中添加.aspallel作为你的回复,但我希望使用一个比“==”更像的LIKE子句,因为我将查找cloumns的子字符串value@meYnot当然,您可以使用
Contains(str)
代替。感谢更新@dasblinkenlight,出现了一个错误,“System.Data.DataRowCollection”不包含“Any”的定义,并且没有接受类型为“System.Data.DataRowCollection”的第一个参数的扩展方法“Any”found@meYnot我添加了缺少的
Cast
,尝试一下。他想搜索所有列。什么是
query
?StringBuilder。。为什么两年前我没有使用AppendFormat方法,我不知道:)
 string currFilter = string.Format(filterString, searchText);
 DataRow[] tmpRows = MyDataTable.Select(currFilter, somethingToOrderBy);
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
    }
 }