проверить, содержит ли строка буквы из другой строки - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над «функцией создания имени». новое имя , которое должно быть создано, не может быть тем же именем, которое уже существует. У меня есть string usernames;, который содержит все уже существующие имена: Том Боб Гарри ... и затем у меня есть поле ввода, где вы можете написать новое имя . string newName = inputField.text

Я хочу сделать оператор if, который проверяет, содержит ли newName имя из string usernames. Я уже пробовал это:

if (usernames.Contains(NewName)) //if the newName not already exists

Но здесь была проблема в том, что каждое newName не содержало имен пользователей, даже если это было так. Я искал часы, но я довольно новичок в этом и не смог найти хороший ответ. Я благодарен за любую помощь! :)

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Недостатком является то, что все имена должны быть объединены в одну большую строку. Проблема в том, что Contains может вернуть true, если вы этого не хотите. Что, если usernames уже содержит «Роберт» и новое проверяемое имя - «Роб»? Теперь Роб не может ввести свое имя, потому что оно конфликтует с Робертом.

Другой пример: если вы выполните проверку без учета регистра, то "Liz" или "Beth" вернет true, если usernames уже содержит "Elizabeth".

Лучшим дизайном будет иметь коллекцию индивидуальных имен. Хотя это может быть List<string>, я думаю, что Hashset<string> лучше подходит для ваших нужд. Если вы хотите, чтобы при поиске учитывался регистр символов, т. Е. «Bob» и «Bob» - это два разных имени, тогда вы ничего особенного не делаете:

Hashset<string> usernames = new Hashset<string>();

Но если вы хотите, чтобы имена были нечувствительными к регистру, тогда вы можете объявить свой набор ha sh соответствующим образом:

Hashset<string> usernames = new Hashset<string>(StringComparer.OrdinalIgnoreCase);

Hashset также имеет метод Contains, но он оптимизирован для быстрого поиска. Для получения дополнительной информации о Hashset см. эту ссылку .

ОБНОВЛЕНО ИСПОЛЬЗОВАНИЕМ

ОП сказал, что он не может использовать Hashset. Это камень преткновения для начинающих учеников. Мы все споткнулись, когда только начали. Чтобы использовать определенные объекты, вам необходимо либо полностью их квалифицировать, что делает ваш код уродливым, либо добавить соответствующий using перед вашим пространством имен.

  • Hashset<T> от System.Collections.Generic

  • StringComparer класс от System.

Вы можете использовать System.Collections.Generic.Hashset<string>, но это кажется немного многословным и некрасиво. Вместо этого добавьте эти операторы перед своим пространством имен:

using System;
using System.Collections.Generic;

И Hashset и StringComparer должны нормально работать.

Подробнее о StringComparer см. эту ссылку .

0 голосов
/ 07 апреля 2020

Я не уверен, что понимаю, что вы действительно хотите сделать, но я думаю, что IndexOf должен сделать свое дело: if(usernames.IndexOf(newName)>0) тогда newName уже существует в именах пользователей.

Или, так как вы пытается: if(usernames.Contains(newName))

...