如何在c#中将一个字符串与大量预定义字符串进行比较?

本文关键字:字符串 预定义 比较 一个 | 更新日期: 2023-09-27 17:49:52

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

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

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

如何在c#中将一个字符串与大量预定义字符串进行比较?

您可以使用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中,并在foreachcontains中进行比较。

我有两种方法来解决这个问题

  1. 使用List并调用"contains"或
  2. 使用长字符串(如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))
{         
}