Эффективно ли использовать LINQ для разбора строк? - PullRequest
1 голос
/ 18 марта 2011

В последние пару недель я так много использовал LINQ, что когда мне пришлось написать однострочную функцию для удаления <и> из строки, я обнаружил, что написал ее как запрос LINQ:

Public Function StripLTGT(text As String) As String
    Return String.Join("", (From i As Char In text.ToCharArray Where i <> "<"c Where i <> ">"c).ToArray)
End Function

У меня вопрос: лучше ли это делать с помощью LINQ, как указано выше, или с StringBuilder, как я всегда делал, как показано ниже:

Public Function StripLTGT(text As String) As String
    Dim a As New StringBuilder(text)
    a = a.Replace("<", "")
    a = a.Replace(">", "")
    Return a.ToString
End Function

Оба работают, второй легче читать, но первый предназначен для выполнения запросов к массивам и другим перечислимым значениям.

Ответы [ 2 ]

2 голосов
/ 18 марта 2011
Regex.Replace("[<>]", "")

Гораздо проще.

Или:

myString = myString.Replace("<", "").Replace(">", "")

Трудно сказать, является ли вариант A, B или C более быстрым, чем другие, поскольку вариант A можетлучше для маленьких струн, тогда как вариант B может быть лучше для длинных струн и т. д.

1 голос
/ 18 марта 2011

Либо все должно быть хорошо с точки зрения функциональности.Первый не эффективен как есть.Вызов ToArray выполняет намного больше работы, чем необходимо (если вы используете .NET 4.0, в любом случае он не нужен), а вызов ToCharArray не нужен.По сути, символы во входной строке повторяются намного больше, чем нужно, и дополнительные массивы выделяются избыточно.

Я бы не сказал, что это особенно имеет значение ;но вы спросили об эффективности, вот почему я упоминаю об этом.

Второй вариант мне кажется подходящим.Обратите внимание, что если вы хотите пойти по однострочному маршруту, вы все равно можете сделать это с StringBuilder, и я думаю, что по-прежнему будет иметь что-то более лаконичное, чем версия LINQ (хотя я не насчитал символов),Мне даже неясно, превосходит ли это даже более прямой вариант String.Replace:

' StringBuilder.Replace version:
Return New StringBuilder(text).Replace("<", "").Replace(">", "").ToString()

' String.Replace version:
Return text.Replace("<", "").Replace(">", "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...