我想将一个字符串与多个字符串进行比较。这在 C# 中是如何完成的?
Contains
扩展方法:
bool isStringContainedInList =
new[] { "string1", "string2", "string3" }.Contains("some string")
我建议您查看这篇维基百科文章关于最长公共子串问题。
我记得本科时找到最长公共子串的一种策略是,您可以首先找到一个稍短的子串,然后从那里扩展(并重复)。也就是说,如果“abcd”是公共子字符串,那么“abc”也是公共子字符串,“ab”也是公共子字符串。
这提供了一种重复算法,您首先找到字符串中出现的所有 2 个字母对(我不关心一个字母子字符串,因为对于大型数据集,它们将包含整个字母表)。然后再次迭代以查找所有 3 个字母的子字符串,依此类推...
要将集合中的所有字符串相互比较以查找重复项,使用字典是最有效的:
string[] strings = { "Zaphod", "Trillian", "Zaphod", "Ford", "Arthur" };
var count = new Dictionary<string, int>();
foreach (string s in strings) {
if (count.ContainsKey(s)) {
count[s]++;
} else {
count.Add(s, 1);
}
}
foreach (var item in count) {
Console.WriteLine("{0} : {1}", item.Key, item.Value);
}
输出:
Zaphod : 2
Trillian : 1
Ford : 1
Arthur : 1
您还可以使用 LINQ 方法来完成此操作:
var count =
strings
.GroupBy(s => s)
.Select(
g => new { Key = g.First(), Value = g.Count() }
);
string[] comparisonList = {"a", "b" "c"};
from s in comparisonList where comparisonList.Contains("b") select s;
如果要比较,请使用 String.Compare。
如果要在列表中查找字符串,请使用与列表类型等效的 Contains/Select 方法。
我喜欢使用 String.Compare() 静态方法,因为它可以让你让一切变得明确。 这很重要,因为字符串比较可能因细微的错误而臭名昭著。
例如:
// Populate with your strings
List<string> manyStrings = new List<string>();
string oneString="target string";
foreach(string current in manyStrings)
{
// For a culture aware, safe comparison
int compareResult=String.Compare(current,oneString,
StringComparison.CurrentCulture);
// OR
// For a higher performance comparison
int compareResult=String.Compare(current,oneString,
StringComparison.Ordinal);
if (compareResult==0)
{
// Strings are equal
}
}
如果您实际上只想知道一个字符串是否是另一个较大字符串的子字符串,在上面的循环中您可以使用:
int indexPos=current.IndexOf(oneString,StringComparison.Ordinal);
if (indexPos>=0)
{
// oneString was found in current
}
请注意,IndexOf 接受相同有用的 StringComparison 枚举。
要查找列表中多次出现在列表中的字符串,您可以开始将这些字符串放入 HashSet 中,并检查每个字符串是否已在此集合中。
例如,您可以:
HashSet<string> hashSet = new HashSet<string>();
foreach (string item in myList)
{
if (hashSet.Contains(item))
{
// already in the list
...
}
else
{
// not seen yet, putting it into the hash set
hashSet.Add(item);
}
}
从 C# 9 版本开始,您可以使用逻辑模式:
if (s is ("string1" or "string2" or "string3"))
{
// do things
}