我正在使用“创建名称功能”。应该创建的新名称不能与已经存在的名称相同。我有一个string usernames;
,其中包含所有已经存在的名称,例如:Tom bob Harry ...,然后有一个输入字段,您可以在其中输入新名称。 string newName = inputField.text
我想执行一个if语句,查找newName是否包含string usernames
中的名称。我已经尝试过了:
if (usernames.Contains(NewName)) //if the newName not already exists
但是这是每个newName即使包含用户名也不包含用户名的问题。我已经搜索了几个小时,但是我对此很陌生,找不到合适的答案。感谢您的帮助! :)
我不确定我是否理解您的真正意愿,但我认为IndexOf应该可以解决问题:if(usernames.IndexOf(newName)>0)
,则用户名中已经存在newName。
或者,您正在尝试:if(usernames.Contains(newName))
将所有名称都塞进一个大字符串中有一个固有的缺陷。问题是,当您不希望包含时,包含可能返回true。如果usernames
已经包含“ Robert”并且要检查的新名称是“ Rob”怎么办?现在,Rob无法输入他的名字,因为它与Robert冲突。
另一个例子:如果您执行不区分大小写的检查,那么如果usernames
已经包含“ Elizabeth”,则“ Liz”或“ Beth”将返回true。
更好的设计是拥有单个名称的集合。虽然这可能是List<string>
,但我认为Hashset<string>
更适合您的需求。如果要使搜索区分大小写,即“ bob”和“ Bob”是2个不同的名称,则无需执行任何特殊操作:
Hashset<string> usernames = new Hashset<string>();
但是如果您确实希望名称不区分大小写,则可以相应地声明您的哈希集:
Hashset<string> usernames = new Hashset<string>(StringComparer.OrdinalIgnoreCase);
哈希集也具有Contains
方法,但已针对快速查找进行了优化。有关哈希集的更多信息,请参见this link。
使用方法更新
OP表示他不能使用Hashset。这是初学者的绊脚石。刚开始时,我们都为之绊倒了。要使用某些对象,您可能需要完全限定它们的资格,这会使您的代码看起来难看,或者在名称空间之前添加适当的using
。
Hashset<T>
来自System.Collections.Generic
StringComparer
类来自System
。
您可以使用System.Collections.Generic.Hashset<string>
,但这似乎有些罗word和丑陋。而是在您的命名空间之前添加以下语句:
using System;
using System.Collections.Generic;
并且Hashset和StringComparer应该可以正常工作。
有关StringComparer的更多信息,请参见this link。>