在C#程序中,我有一个String
变量,我想将它与一百个预定义(硬编码)字符串文字进行比较,以便我知道它是否与这些预定义字符串中的任何一个匹配。
我当然可以编写switch
或if-else if
链,但这样字符串与控制语句和IMO交错,这会降低可读性并使错误更容易种植。
有没有办法以某种方式列出所有字符串,以便它们尽可能在代码中彼此靠近?
答案 0 :(得分:8)
您可以使用HashSet(或Dictionary),然后检查密钥是否存在。
答案 1 :(得分:5)
如果除了硬编码字符串之外没办法,你可以在HashSet中定义它们:
var strs = new HashSet<string>{ "Str1","Str2","Str3" };
忽略大小写:
var strs = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Str1","Str2","Str3" };
并且:
var found = strs.Contains(myVariable);
答案 2 :(得分:3)
如果我是你,我会将所有这些字符串放在List
中,并在foreach
或contains
中进行此比较。
答案 3 :(得分:3)
我接触过这两种方式
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
}
}
答案 4 :(得分:3)
如果性能是最重要的,并且如果要在编译时知道要搜索的字符串,则可以创建minimal perfect hash并将字符串存储在数组中。
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
的代码是棘手的部分。
答案 5 :(得分:2)
如果此列表没有更改,则将它们全部放入集合中并遍历集合并比较字符串。
使用switch语句或if-else ifs在100个案例中不正确。
答案 6 :(得分:2)
创建(字符串,字符串)字典,使用键和值添加所有预定义字符串作为相同的字符串。您可以使用dictionary.ContainsKey()函数来检查字典中是否存在输入字符串。
这也比循环遍历所有字符串并进行比较更快,因为字典将使用散列函数来更快地定位键而不是循环。
答案 7 :(得分:2)
List<String> strings = new List<String>{"String 1", "String 2", "String 3" ...};
if (strings.Contains(stringValue))
{
}