Самый быстрый способ преобразовать список строк в единственную сцепленную строку?

@jfm3 - у Вас есть хороший ответ на вопрос. Вы могли бы также хотеть добавить, что макро-идиома также предотвращает возможно более опасный (потому что нет никакой ошибки), непреднамеренное поведение с простым, 'если' операторы:

#define FOO(x)  f(x); g(x)

if (test) FOO( baz);

расширяется до:

if (test) f(baz); g(baz);

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

9
задан jasonh 14 July 2009 в 22:59
поделиться

5 ответов

Как насчет:

public static string Concat(this IEnumerable<string> source) {
    StringBuilder sb = new StringBuilder();
    foreach(string s in source) {
        sb.Append(s);
    }
    return sb.ToString();
}

и:

string s = data.Concat();

Тогда нет необходимости в дополнительном шаге ToList () / ToArray () .

22
ответ дан 4 December 2019 в 06:11
поделиться

Вы пробовали String.Join? Если вы уже готовы взять на себя накладные расходы, связанные с вызовом .ToList, вместо этого используйте .ToArray () и объедините его с вызовом String.Join.

var joined = String.Concat(someQuery.ToArray());

Примечание. Мое решение, вероятно, не самое быстрое, так как оно требует небольшого накладных расходов в массиве. Я подозреваю, что было бы быстрее пойти побольше Marc ' s маршрут. Но в большинстве случаев, если вы просто ищете быстрый и грязный способ сделать это в коде, мой маршрут будет работать.

16
ответ дан 4 December 2019 в 06:11
поделиться

Используйте "Aggregate" следующим образом:

    List<string> strings = new List<string>() {"bob", "steve", "jane"};
    string result = strings.Aggregate((working, next) => working + next);
    Console.WriteLine(result);

Примечание: Aggregate находится в пространстве имен System.Linq как метод расширения.

3
ответ дан 4 December 2019 в 06:11
поделиться

В зависимости от того, как JIT оптимизирует его, либо string.Concat (), либо метод Марка с StringBuilder могут быть быстрее. Поскольку вы здесь используете Linq, я предполагаю, что производительность не является абсолютным требованием №1, и в этом случае я бы выбрал самый простой для чтения:

string.Concat(data.ToArray());

Изменить: если и только если данные IEnumerable из тип значения , вам нужно преобразовать его в IEnumerable :

string.Concat(data.Cast<object>().ToArray())

Редактировать 2: Я не имею в виду, что Linq работает медленно. Я имею в виду только то, что разница в скорости между двумя упомянутыми мною способами должна быть чрезвычайно минимальной, если даже измеримой.

Редактировать 3: JIT оптимизирует почти все операции в классе String, поэтому единственный вызов внутренней среды выполнения string.Concat действительно может быть быстрее, чем использование StringBuilder. Я не уверен, что это так, но вы должны проверить это, чтобы убедиться.

0
ответ дан 4 December 2019 в 06:11
поделиться
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
1
ответ дан 4 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

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