Эффективно проверить, содержит ли любая ячейка в DataTable подстроку - PullRequest
0 голосов
/ 01 апреля 2019

Я использую приведенный ниже код, чтобы позволить пользователю фильтровать 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 Ответ

2 голосов
/ 01 апреля 2019

Чтобы выполнить поиск, если содержимое ячейки содержит искомый текст, попробуйте следующий код:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...