如何将字符串与C#中的大量预定义字符串进行比较?

时间:2011-04-13 11:46:22

标签: c# string

在C#程序中,我有一个String变量,我想将它与一百个预定义(硬编码)字符串文字进行比较,以便我知道它是否与这些预定义字符串中的任何一个匹配。

我当然可以编写switchif-else if链,但这样字符串与控制语句和IMO交错,这会降低可读性并使错误更容易种植。

有没有办法以某种方式列出所有字符串,以便它们尽可能在代码中彼此靠近?

8 个答案:

答案 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中,并在foreachcontains中进行此比较。

答案 3 :(得分:3)

我接触过这两种方式

  1. 使用列表并调用“包含” 或
  2. 使用长字符串(string lits = "one|two|three"),然后找到然后调用lits.indexOf(otherString + "|"),如果值大于-1,那么你就有了一个...
  3. 干杯

    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))
{         
}