高效检查DataTable中的任何单元格是否包含子字符串

时间:2019-04-01 17:16:55

标签: c# winforms

我正在使用下面的代码,允许用户通过搜索可能在任何列或任何行中的特定字符串来过滤DataTable。该代码需要删除在操作后导出DataTable时该值不存在的行。

此代码的问题有两个方面:1)对于较大的表,它非常慢,并且2)它只能找到单元格的完整内容(即,如果“名称”列中包含值所在的行)是“ Andrew”,用户应该能够搜索“ drew”或“ and”并获得结果;现在,如果他们搜索“ Andrew”,它将返回该行。)

if(!String.IsNullOrEmpty(combo1Text) || !String.IsNullOrEmpty(combo2Text)
                && !String.IsNullOrEmpty(search1Text) && !search1Text.Contains("Type your search for" + comboText + "here"))
            {
                for (int i = tab1table.Rows.Count - 1; i >= 0; i--)
                {
                    DataRow dr = tab1table.Rows[i];
                    if (!dr.ItemArray.Contains(search1Text))
                    {
                        dr.Delete();
                        tab1table.AcceptChanges();
                    }
                    percentprogress++;
                    worker.ReportProgress(percentprogress);
                }
            }

进行我想要的过滤的最佳方法是什么(并高效地进行过滤,以使它不仅遍历所有内容)?

1 个答案:

答案 0 :(得分:2)

要搜索单元格内容是否包含搜索到的文本,请尝试以下代码:

for (int i = tab1table.Rows.Count - 1; i >= 0; i--)
{
    DataRow dr = tab1table.Rows[i];
    if (!dr.ItemArray.Any(x=>(x as string).Contains(search1Text)))
    {
        dr.Delete();
    }
    percentprogress++;
    worker.ReportProgress(percentprogress);
}
tab1table.AcceptChanges();

如果您有任何非字符串类型的列,则应将(x as string)替换为x.ToString()