В упрощенном примере существует 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 и нечеток о том, как пойти об объединении их или каковы хиты производительности к уже вялому процессу будут.
Здесь три шага:
MatchCollection
в IEnumerable
Match. Success
свойство trueКод:
IEnumerable<Match> combined = matchNoCase.OfType<Match>().Concat(matchCase.OfType<Match>()).Where(m => m.Success);
Это создает новый перечислитель, который выполняет каждый шаг только по мере получения следующего результата, так что в итоге вы перебираете каждую коллекцию только один раз. Например, Concat() начнет выполнять второй перечислитель только после того, как закончится первый.