List<string> words = new List<string> { "abc", "acb", "cba", "cb a", "abf", "sea", "aba", "so ap", "a b c" };
string allowedChars = "abc";
Я хочу проверить недопустимые символы в строке списка. Я пытаюсь использовать IndexOfAny (), но IndexOfAny () не проверяет пробелы. Как проверить строку, содержащую недопустимые символы?
Результат хочу: "cb a", "abf", "sea", "so ap", "a b c"
@mjwills "", "a", "ac" не должны возвращаться
@mjwills "bcaa" тоже не следует возвращать
var invalid = words.Where(w => !w.All(allowedChars.Contains));
Он проверяет каждое слово, есть ли в нем хотя бы один символ, которого нет в allowedChars
.
Это то же самое, но немного более подробно:
var invalid = words.Where(w => w.Any(c => !allowedChars.Contains(c)));
Оба прекращают выполнение, если находят первый несодержащийся символ.
Как заметил Джухарр, если разрешено много символов, вы могли бы сделать его более эффективным, используя HashSet<char>
вместо String
:
var alloweCharSet = new HashSet<char>(allowedChars);
В зависимости от количества символов было бы неплохо поместить их в HashSet
.
Возвращает все слова, содержащие любые символы, кроме allowedChars:
var result = words.Where(w => w.Except(allowedChars).Any());
Хотя это дает желаемый результат, было указано, что при вызове Except будет создан новый Set
для allowedChars
для каждого word
в списке. Это может дать не лучшую производительность.
Если вы собираетесь использовать Except
, вам лучше поместить allowedChars
в HashSet
, а затем использовать Contains
- perf будет намного лучше этого. Поскольку этот код фактически создает HashSet
на слово, а не один HashSet
- github.com/Microsoft/referencesource/blob/master/System.Core /….
Следует ли вернуть
"bcaa"
?""
?"a"
?"ac"
?