如何在c#中将一个字符串与大量预定义字符串进行比较?
本文关键字:字符串 预定义 比较 一个 | 更新日期: 2023-09-27 17:49:52
在c#程序中,我有一个String
变量,我想将它与100个预定义的(硬编码的)字符串进行比较,以便我知道它是否与这些预定义字符串中的任何一个匹配。
我当然可以写一个switch
或if-else if
链,但这样字符串与控制语句和IMO交错,降低了可读性,使植入错误更容易。
是否有一种方法以某种方式列出所有字符串,使它们在代码中尽可能靠近彼此?
您可以使用HashSet(或Dictionary),然后检查键是否存在。
如果没有办法只能硬编码字符串,您可以在HashSet中定义它们:
var strs = new HashSet<string>{ "Str1","Str2","Str3" };
忽略大小写:
var strs = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Str1","Str2","Str3" };
:
var found = strs.Contains(myVariable);
如果我是你,我会把所有这些字符串放在List
中,并在foreach
或contains
中进行比较。
我有两种方法来解决这个问题
- 使用List并调用"contains"或
- 使用长字符串(如
string lits = "one|two|three"
),然后找到然后调用lits.indexOf(otherString + "|")
,如果值大于-1那么你有一个命中…
CEC
private const string _searched = "one|two|three";
private void button1_Click(object sender, EventArgs e)
{
string search = "two" + "|";
if (_searched.IndexOf(search) > -1)
{
//do something
}
}
private List<string> _searchedList = new List<string>() { "one", "two", "three" };
private void button2_Click(object sender, EventArgs e)
{
string search = "two";
if (_searchedList.Contains(search))
{
//do something
}
}
如果性能是最重要的,如果要搜索的字符串在编译时是已知的,您可以创建一个最小的完美哈希并将字符串存储在数组中。
var stringTable = new[] { "The", "quick", "brown", ... };
var input = "fox";
var hash = ComputeMinimalPerfectHash(input);
var match = stringTable[hash];
if (input == match)
// You have found a match.
显然,基于字符串生成ComputeMinimalPerfectHash
的代码是比较棘手的部分。
如果此列表没有更改,则将它们全部放入一个集合中,并遍历该集合并比较字符串。
在一百种情况下,使用switch语句或if-else if语句是不正确的。
创建一个字典(string, string),添加所有预定义字符串与键和值为相同的字符串。您可以使用dictionary. containskey()函数检查输入字符串是否存在于字典中。
这也将比循环遍历所有字符串并进行比较更快,因为字典将使用哈希函数来更快地定位键,而不是循环。
List<String> strings = new List<String>{"String 1", "String 2", "String 3" ...};
if (strings.Contains(stringValue))
{
}