有没有比在字符串数组中查找字符串更快的方法?
本文关键字:字符串 方法 数组 有没有 查找 | 更新日期: 2023-09-27 18:08:55
目前我正在这样做:
List<int> ID = new List<int>();
int a = 0;
string[] findWordHere = ...
string[] findOtherWordHere = ...
string word = "this";
string otherWord = "that";
foreach (string word in findWordHere)
{
foreach (string otherWord in findOtherWordHere)
{
if (word == otherWord)
{
ID.Add(a + 1);
}
}
a++;
}
这非常耗时。有没有更好的方法,比如用linq?
是的,有。在第一个循环之前添加findOtherWordHere
到HashSet<string>
的所有项,并将其用于查找,如下所示:
ISet<string> lookup = new HashSet<string>(findOtherWordHere);
foreach (string word in findWordHere)
{
if (lookup.Contains(word))
{
ID.Add(a + 1);
}
a++;
}
这在时间上与findWordHere
和findOtherWordHere
长度的和成正比,因为HashSet<string>
是在线性时间内构建的,并提供恒定时间的查找功能。
另一方面,您的原始方法的运行时间与findWordHere
和findOtherWordHere
长度的乘积成正比,因为最坏的情况是在外部循环的每次迭代中执行一个内部循环以完成。
您可以使用HashSet<string>
:
var set = new HashSet<string>(findOtherWordHere);
var IDs = findWordHere
.Select((w,i) => new {w,i})
.Where(p => set.Contains(p.w))
.Select(p => p.i)
.ToList();
这提供了包含在另一个列表中的单词的索引,没有循环并且具有合理的性能。
如果你不需要数组,你可以使用StringComparison
方法:
List<int> ID = new List<int>();
int a = 0;
string root = "that";
string root2 = "that";
bool result = root.Equals(root2, StringComparison.Ordinal);
if (result)
{
ID.Add(a + 1);
}
或者如果你想忽略大小写,使用OrdinalIgnoreCase
,记住顺序是比较两个字符串的最快方式:
List<int> ID = new List<int>();
int a = 0;
string root = "that";
string root2 = "that";
bool result = root.Equals(root2, StringComparison.OrdinalIgnoreCase);
if (result)
{
ID.Add(a + 1);
}