@jfm3 - у Вас есть хороший ответ на вопрос. Вы могли бы также хотеть добавить, что макро-идиома также предотвращает возможно более опасный (потому что нет никакой ошибки), непреднамеренное поведение с простым, 'если' операторы:
#define FOO(x) f(x); g(x)
if (test) FOO( baz);
расширяется до:
if (test) f(baz); g(baz);
, который синтаксически корректен, таким образом, нет никакой ошибки компилятора, но имеет, вероятно, непреднамеренное последствие, которым будут всегда называть g ().
Как насчет:
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 ()
.
Вы пробовали String.Join? Если вы уже готовы взять на себя накладные расходы, связанные с вызовом .ToList, вместо этого используйте .ToArray () и объедините его с вызовом String.Join.
var joined = String.Concat(someQuery.ToArray());
Примечание. Мое решение, вероятно, не самое быстрое, так как оно требует небольшого накладных расходов в массиве. Я подозреваю, что было бы быстрее пойти побольше Marc ' s маршрут. Но в большинстве случаев, если вы просто ищете быстрый и грязный способ сделать это в коде, мой маршрут будет работать.
Используйте "Aggregate" следующим образом:
List<string> strings = new List<string>() {"bob", "steve", "jane"};
string result = strings.Aggregate((working, next) => working + next);
Console.WriteLine(result);
Примечание: Aggregate находится в пространстве имен System.Linq как метод расширения.
В зависимости от того, как 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. Я не уверен, что это так, но вы должны проверить это, чтобы убедиться.
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();