编辑2:
确认我的性能问题是由对StringExtensions类的静态函数调用引起的。一旦删除,IndexOf方法确实是实现此目的的最快方法。
查看字符串是否包含C#中的另一个字符串的最快,不区分大小写的方法是什么?我在这里看到了这个帖子的公认解决方案 不区分大小写'包含(字符串)' 但我已经做了一些初步的基准测试,似乎使用该方法会导致在无法找到测试字符串时对较大字符串(> 100个字符)的调用速度减慢。
以下是我所知道的方法:
指数:
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
return false;
return source.IndexOf(toCheck, comp) >= 0;
}
ToUpper的:
source.ToUpper().Contains(toCheck.ToUpper());
正则表达式:
bool contains = Regex.Match("StRiNG to search", "string", RegexOptions.IgnoreCase).Success;
所以我的问题是,这实际上是平均最快的方式,为什么呢?
编辑:
这是我用来突出性能差异的简单测试应用程序。使用它,我看到ToLower()为16 ms,ToUpper为18 ms,StringExtensions.Contains()为140 ms:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace ScratchConsole
{
class Program
{
static void Main(string[] args)
{
string input = "";
while (input != "exit")
{
RunTest();
input = Console.ReadLine();
}
}
static void RunTest()
{
List<string> s = new List<string>();
string containsString = "1";
bool found;
DateTime now;
for (int i = 0; i < 50000; i++)
{
s.Add("AAAAAAAAAAAAAAAA AAAAAAAAAAAA");
}
now = DateTime.Now;
foreach (string st in s)
{
found = st.ToLower().Contains(containsString);
}
Console.WriteLine("ToLower(): " + (DateTime.Now - now).TotalMilliseconds);
now = DateTime.Now;
foreach (string st in s)
{
found = st.ToUpper().Contains(containsString);
}
Console.WriteLine("ToUpper(): " + (DateTime.Now - now).TotalMilliseconds);
now = DateTime.Now;
foreach (string st in s)
{
found = StringExtensions.Contains(st, containsString, StringComparison.OrdinalIgnoreCase);
}
Console.WriteLine("StringExtensions.Contains(): " + (DateTime.Now - now).TotalMilliseconds);
}
}
public static class StringExtensions
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
}
}