检查一个字符串是否包含来自另一个字符串的字母

check if a string contains letters from another string

我正在研究 "Create name function"。应创建的新名称不能与已存在的名称相同。 我有一个 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))

将所有名称都塞到一个大字符串中存在固有缺陷。问题是 Contains 可以 return true 当你不想要它的时候。如果 usernames 已经包含 "Robert" 并且要检查的新名称是 "Rob" 怎么办?现在 Rob 无法输入他的名字,因为它与 Robert 冲突。

另一个示例:如果您执行不区分大小写的检查,那么如果 usernames 已经包含 "Elizabeth",则 "Liz" 或 "Beth" 将 return 为真。

更好的设计是收集个人姓名。虽然这可能是 List<string>,但我认为 Hashset<string> 更适合您的需求。如果您希望搜索区分大小写,即 "bob" 和 "Bob" 是 2 个不同的名称,那么您无需执行任何特殊操作:

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

但是如果您确实希望名称不区分大小写,那么您可以相应地声明您的哈希集:

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

Hashset 也有一个 Contains 方法,但它针对快速查找进行了优化。有关哈希集的更多信息,请参阅 this link.

使用更新

OP 说他不能使用 Hashset。这是初学者的绊脚石。当我们刚开始的时候,我们都被它绊倒了。要使用某些对象,您要么需要完全限定它们,这会使您的代码看起来很丑陋,要么在您的命名空间之前添加适当的 using

  • Hashset<T> 来自 System.Collections.Generic

  • StringComparer class 来自 System.

您可以使用 System.Collections.Generic.Hashset<string> 但这看起来有点冗长和丑陋。相反,在您的命名空间之前添加这些语句:

using System;
using System.Collections.Generic;

并且 Hashset 和 StringComparer 应该可以正常工作。

有关 StringComparer 的更多信息,请参阅 this link