Производительность сравнения строк в C#

RequireJS - загрузчик файлов и модулей JavaScript. Он оптимизирован для использования в браузере, но может использоваться в других средах JavaScript, таких как Rhino и Node. Использование модульного загрузчика скриптов, такого как RequireJS, улучшит скорость и качество вашего кода. Совместим практически со всеми последними браузерами.

Добавьте это в ваш проект

Затем взгляните на это .

20
задан Jagd 6 February 2012 в 18:38
поделиться

8 ответов

According to Reflector

"Hello" == "World"

is the same as

String.Equals("Hello", "World");

which basically determines if they are the same reference object, if either of them is null, which would be an automatic false if one was null and the other was not, and then compares each character in an unsafe loop. So it doesn't care about cultural rules at all, which usually isn't a big deal.

and

"Hello".CompareTo("World") == 0

is the same as

CultureInfo.CurrentCulture.CompareInfo.Compare("Hello", "World", CompareOptions.None);

This is basically the opposite as far as functionality. It takes into consideration culture, encoding, and everything else with the string in to context.

So I would imagine that String.CompareTo is a couple of orders of magnitude slower than the equality operator.

as for your LINQ it doesn't matter if you are using LINQ-to-SQL because both will generate the same SQL

var results = from names in ctx.Names
          where names.FirstName.CompareTo("Bob Wazowski") == 0
          select names;

of

SELECT [name fields]
FROM [Names] AS [t0]
WHERE [t0].FirstName = @p0

so you really aren't gaining anything for LINQ-to-SQL except harder to read code and probably more parsing of the expressions. If you are just using LINQ for standard array stuff then the rules I laid out above apply.

25
ответ дан 29 November 2019 в 23:00
поделиться

Есть хорошая статья Сравнение значений для равенства в .NET: идентичность и эквивалентность , которая является немного более общей, чем просто сравнение строк, но, тем не менее, очень интересной.

1
ответ дан 29 November 2019 в 23:00
поделиться

Недавно был довольно похожий вопрос относительно самого быстрого способа обрезки строки, но в основном это было тестирование различных способов их сравнения.

Вы можете проверить тесты в этом сообщении .

2
ответ дан 29 November 2019 в 23:00
поделиться

Прочтите Джеффа Лучший код - это не код вообще . foo.CompareTo (bar) == 0 : ужасный визуальный беспорядок. Занимает много места и не несет интересного смысла. Фактически, он подчеркивает множество несущественных вещей, которые отвлекают внимание от реальной проблемы.

Если нет четко определенной причины для использования этого более длинного варианта, не делайте этого.

Что касается производительности: она просто не делает » Не имеет значения для этого простого случая. Если оператор равенства == действительно должен работать хуже, чем CompareTo , не стесняйтесь отправлять отчет об ошибке в Microsoft. Этого не должно происходить.

8
ответ дан 29 November 2019 в 23:00
поделиться

На мой взгляд, вы всегда должны использовать самый ясный способ, который использует == !

Это можно понять напрямую: когда «Hello» равно «World» "затем сделайте что-нибудь.

if ("Hello" == "World")
    // ...

Внутри вызывается String :: Equals , который существует явно для этой цели - сравнение двух строк на равенство. (Это не имеет ничего общего с указателями, ссылками и т. Д.)

Здесь не сразу понятно - зачем сравнивать с нулем?

if ("Hello".CompareTo("World") == 0)

.CompareTo не предназначен только для проверки равенства (для этого у вас есть ==) - Он сравнивает две струны. Вы используете .CompareTo для сортировки, чтобы определить, "больше" ли одна строка, чем другая. Вы можете проверить равенство, потому что это дает ноль для одинаковых строк, но это не то, для чего это задумано.

16
ответ дан 29 November 2019 в 23:00
поделиться

Если бы оператор равенства действительно работал хуже, чем CompareTo , разве Microsoft не реализовала бы вызов оператора равенства CompareTo ?

Просто используйте оператор равенства для проверки равенства.

1
ответ дан 29 November 2019 в 23:00
поделиться

, я обычно использую String.Compare с перегрузкой, которая принимает параметр StringComparison, потому что тогда я могу абсолютно точно указать, учитывается ли при сравнении регистр и региональные параметры. , Для этого требуется .NET 2.0 или более поздняя версия.

Самым быстрым является StringComparison.Ordinal (или StringComparison.OrdinalIgnoreCase, если регистр не учитывается) для сравнений, которые не зависят от языка и региональных параметров.

0
ответ дан 29 November 2019 в 23:00
поделиться

Лучший способ сравнения строка в C # - использовать a.Equals (b) , где a и b - строки. Это лучший способ сравнения строк, поскольку он сравнивает значения объектов a и b и не зависит от ссылки на объекты.

Если вы собираетесь использовать символ " == " , результат будет одинаковым, если оба объекта имеют одну и ту же ссылку, но возникнет проблема, если они будут иметь разные ссылки и одинаковое значение.

Метод compareTo - лучший способ использовать, если вы проверяете, действительно ли другая строка предшествует, следует или появляется в той же позиции другой строки, при этом она будет возвращать отрицательное значение, положительное значение или нулевое значение соответственно. Он также вернет положительное значение, если параметр null

0
ответ дан 29 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: