Эффективно объедините MatchCollections в.Net Regex

В упрощенном примере существует 2 Регулярных выражения, одно чувствительное к регистру, другой нет. Идея состояла бы в том, чтобы эффективно создать набор IEnumerable (см. "объединенный" ниже), объединение результатов.

string test = "abcABC";
string regex = "(?<grpa>a)|(?<grpb>b)|(?<grpc>c)]";
Regex regNoCase = new Regex(regex, RegexOptions.IgnoreCase);
Regex regCase = new Regex(regex);

MatchCollection matchNoCase = regNoCase.Matches(test);
MatchCollection matchCase = regCase.Matches(test);

//Combine matchNoCase and matchCase into an IEnumerable
IEnumerable<Match> combined= null;
foreach (Match match in combined)
{
    //Use the Index and (successful) Groups properties 
    //of the match in another operation

}

На практике MatchCollections мог бы содержать тысячи результатов и часто выполняться с помощью, долго динамично создал REGEXes, таким образом, я хотел бы уклониться от копирования результатов к массивам и т.д. Я все еще изучаю LINQ и нечеток о том, как пойти об объединении их или каковы хиты производительности к уже вялому процессу будут.

11
задан Steven Doggart 29 September 2015 в 15:43
поделиться

1 ответ

Здесь три шага:

  1. Преобразование MatchCollection в IEnumerable
  2. Конкатенация последовательностей
  3. Фильтрация по наличию Match. Success свойство true

Код:

IEnumerable<Match> combined = matchNoCase.OfType<Match>().Concat(matchCase.OfType<Match>()).Where(m => m.Success);

Это создает новый перечислитель, который выполняет каждый шаг только по мере получения следующего результата, так что в итоге вы перебираете каждую коллекцию только один раз. Например, Concat() начнет выполнять второй перечислитель только после того, как закончится первый.

18
ответ дан 3 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: