Вот что я пытаюсь сделать в целом. Чтобы быть ясным, это не домашнее задание или конкурс или что-то еще. Надеюсь, я достаточно четко сформулировал формулировку:
Проблема
Учитывая набор строк в том же формате, но там, где какой-то конец в строчной букве, а некоторые нет, верните набор из одной строки, которая не заканчивается строчной буквой, но имеет по крайней мере одну идентичную строка, заканчивающаяся строчной буквой.
Пример
Чтобы это было просто, пусть говорят, что формат строки \d+[a-z]?
, где общая часть - это число. Учитывая {1, 4, 3a, 1b, 3, 6c}
, я должен получить перестановку {1, 3}
, потому что 1 и 3 имеют как элемент с буквой в нижнем регистре, так и без него.
Альтернативное решение
Вы можете посмотреть это решение здесь.
Один из способов, которым я думал сделать это, - разбить набор на элементы с суффиксом букв в нижнем регистре ({1, 4, 3}
и {3a, 1b, 6c}
) и затем вернуться withoutSuffix.Where(x => withSuffix.Any(y => y.StartsWith(x)))
.
У меня есть две проблемы:
-
Я не вижу хорошего способа разбиения на два набора с предикатом
Regex.IsMatch(input, "[a-z]$")
. Я думал, что это две одинаково определенные переменные, каждая из которых использует предложениеWhere
и выполняет регулярное выражение, совпадающее дважды на элемент, или преобразование набора для хранения результатов соответствия регулярному выражению, а затем формирование двух переменных из этого.group...by
, похоже, не очень хорошо играет, когда вам нужно получить доступ к обоим наборам, как это, но я мог ошибаться. -
Хотя размер достаточно мал, чтобы не заботиться о производительности, переход через
withSuffix
один раз за элементwithoutSuffix
кажется неэлегантным.
Релевантное решение
Вы можете посмотреть это решение здесь.
Другим способом, который пришел на ум, было захватить общий префикс и дополнительный суффикс: {1 => {"", b}, 3 => {a, ""}, 4 => {""}, 6 => {c}}
. Это легко осуществить, захватив префикс и суффикс с помощью регулярного выражения ((\d+)([a-z])?
) и группируя суффикс с помощью префикса в grouped
.
Отсюда было бы здорово:
where grouped.SomeButNotAll(x => x == string.Empty)
select grouped.Key
Или даже:
where grouped.ContainsSomeButNotAll(string.Empty)
select grouped.Key
Я мог бы создать любой из них, но, к сожалению, лучшее, что я вижу в LINQ, это:
where grouped.Contains(string.Empty) && grouped.Any(x => x != string.Empty)
select grouped.Key
Это просто супер избыточно. В LINQ уже есть что-то лучше этого?
P.S. Я открыт для лучших подходов к решению общей проблемы вместо того, чтобы сделать это проблемой XY. Элегантность желательна гораздо больше, чем производительность, но (возможно, это только я), являясь простой расточительностью, все еще кажется неэлегантной.