Самый быстрый способ преобразовать список строк в одну объединенную строку? - PullRequest
9 голосов
/ 15 июля 2009

У меня есть некоторый код LINQ, который генерирует список строк, например:

var data = from a in someOtherList
           orderby a
           select FunctionThatReturnsString(a);

Как мне преобразовать этот список строк в одну большую объединенную строку? Допустим, данные имеют следующие записи:

"Some "
"resulting "
"data here."

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

"Some resulting data here."

Как я могу сделать это быстро? Я думал об этом:

StringBuilder sb = new StringBuilder();
data.ToList().ForEach(s => sb.Append(s));
string result = sb.ToString();

Но это не похоже на правду. Если это правильное решение, как мне превратить это в метод расширения?

Ответы [ 7 ]

22 голосов
/ 15 июля 2009

Как насчет:

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().

16 голосов
/ 15 июля 2009

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

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

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

3 голосов
/ 15 июля 2009

Используйте «Совокупность», как это:

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

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

1 голос
/ 12 мая 2016

Вы можете использовать это утверждение. String.join ( "", someOtherList);

1 голос
/ 15 июля 2009
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
0 голосов
/ 18 июля 2013

Альтернатива:

>>> data = ['Some ', 'resulting ', 'data here.']
>>> s = ''.join(data)
>>> s
'Some resulting data here.'
0 голосов
/ 15 июля 2009

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

string.Concat(data.ToArray());

Редактировать: если и только если данные IEnumerable типа значения , вам необходимо преобразовать их в IEnumerable :

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

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

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

...