РЕДАКТИРОВАТЬ 2:
Подтвердил, что мои проблемы с производительностью были вызваны статическим вызовом функции класса StringExtensions. После удаления метод IndexOf действительно является самым быстрым способом достижения этой цели.
Какой самый быстрый, без учета регистра способ увидеть, содержит ли строка другую строку в C #? Я вижу приемлемое решение для поста здесь Без учета регистра 'Contains (string)' , но я провел предварительный сравнительный анализ, и кажется, что использование этого метода приводит к более медленным вызовам на более крупные строки на несколько порядков (> 100 символов) всякий раз, когда тестовая строка не может быть найдена.
Вот методы, которые я знаю:
IndexOf:
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());
Regex:
bool contains = Regex.Match("StRiNG to search", "string", RegexOptions.IgnoreCase).Success;
Итак, мой вопрос: какой действительно самый быстрый путь в среднем и почему так?
EDIT:
Вот мое простое тестовое приложение, которое я использовал, чтобы подчеркнуть разницу в производительности. Используя это, я вижу 16 мс для ToLower (), 18 мс для ToUpper и 140 мс для StringExtensions.Contains ():
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;
}
}
}