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

3
在C#程序中,我有一个String变量,我想将其与100个预定义(硬编码)的字符串文字进行比较,以便我知道它是否与任何这些预定义字符串匹配。
当然,我可以编写一个switch或一系列if-else if语句,但是这样会使字符串与控制语句交错,我认为这会降低可读性并使错误更容易发生。
是否有一种方法可以以尽可能靠近彼此的方式列出所有字符串?

你所说的“列出所有字符串”,是指扫描项目并查找硬编码的文字吗? - V4Vendetta
@V4Vendetta:不,我会自己写全部的代码。 - sharptooth
8个回答

8
你可以使用 HashSet(或Dictionary),然后只需检查键是否存在即可。

我什么时候填充字典? - sharptooth
@Sharptooth:如果您有这么多的值,我可能会根据您的应用程序从文件或数据库中填充它。如果这不是可选项,则可以使用硬编码字符串填充它。 - Brian Rasmussen
我的问题是什么时候运行那个种群代码。在C++中,我只需声明一个静态数组,并在程序以完全线程安全的方式启动时进行初始化 - 我该如何在C#中方便地实现这一点? - sharptooth
@sharptooth:我不知道你的代码具体是什么,但你可以在包含硬编码字符串的类的静态构造函数中创建哈希集。 - digEmAll

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);

包含一个数组是O(n),因此这可能太昂贵了。 - Brian Rasmussen
我对像这样的情况下Linq的性能没有什么概念,但总的来说,我认为像Brian建议的哈希表会更快。 - Remy
小心Contains<T>(T s, IEqualityComparer<T> comparer)方法,它是扩展方法 :) - mathieu

3

我处理这个问题的两种方法:

  1. 使用列表并调用 "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
            }
        }

3
如果性能至关重要,并且要搜索的字符串在编译时已知,您可以创建一个“最小完美哈希”并将字符串存储在数组中。 (了解更多)
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代码是棘手的部分。

3
如果我是你,我会把所有这些字符串放在一个List中,并在foreachcontains中进行比较。

2
List<String> strings = new List<String>{"String 1", "String 2", "String 3" ...}; 
if (strings.Contains(stringValue))
{         
} 

2

如果这个列表没有变化,你可以将它们全部放入一个集合中,并循环遍历该集合并比较字符串。

在有一百个情况的情况下,使用switch语句或if-else if语句是不正确的。


2
创建一个 (字符串, 字符串) 的字典,将所有预定义的字符串与键和值相同的字符串添加进去。您可以使用 dictionary.ContainsKey() 函数来检查输入字符串是否存在于字典中。
这样做比循环所有字符串并进行比较更快,因为字典将使用哈希函数更快地定位键,而不是循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接