Хорошо,
У нас есть много предложений в нашем коде. У нас есть так же много способов генерации строки для представления условия. Я пытаюсь придумать чистый путь следующим образом:
public static string Join<T>(this IEnumerable<T> items, string separator)
{
var strings = from item in items select item.ToString();
return string.Join(separator, strings.ToArray());
}
его можно использовать следующим образом:
var values = new []{1, 2, 3, 4, 5, 6};
values.StringJoin(",");
// result should be:
// "1,2,3,4,5,6"
Итак, это хороший метод расширения, который выполняет очень базовую работу. Я знаю, что простой код не всегда превращается в быстрое или эффективное исполнение, но мне просто интересно, что я мог пропустить с помощью этого простого кода. Другие члены нашей команды утверждают, что:
Любой эксперт, чтобы прослушивать?
Привет,
Эрик.
Что касается первой проблемы, вы можете добавить еще один параметр "formatter", чтобы управлять преобразованием каждого элемента в строку:
public static string Join<T>(this IEnumerable<T> items, string separator)
{
return items.Join(separator, i => i.ToString());
}
public static string Join<T>(this IEnumerable<T> items, string separator, Func<T, string> formatter)
{
return String.Join(separator, items.Select(i => formatter(i)).ToArray());
}
Что касается вторых двух проблем, я бы не стал беспокоиться об этом, если вы не столкнетесь с проблемами производительности и не обнаружите, что это проблема. Это вряд ли может быть большим количеством узких мест...
Join
предпочтения в качестве ссылки ниже , показывает , что разница в производительности незначительна и является предпочтительной читаемостью / простота.
По какой-то причине я подумал, что String.Join
реализуется в терминах класса StringBuilder
. Но если это не так, то, скорее всего, лучше для больших входов, поскольку он не воссоздает объект String
для каждого объединения в итерации.
public static string Join<T>(this IEnumerable<T> items, string separator)
{
// TODO: check for null arguments.
StringBuilder builder = new StringBuilder();
foreach(T t in items)
{
builder.Append(t.ToString()).Append(separator);
}
builder.Length -= separator.Length;
return builder.ToString();
}
РЕДАКТИРОВАТЬ: анализ, когда целесообразно использовать StringBuilder
и String.Join
.
это тоже сработает:
public static string Test(IEnumerable<T> items, string separator)
{
var builder = new StringBuilder();
bool appendSeperator = false;
if(null != items)
{
foreach(var item in items)
{
if(appendSeperator)
{
builder.Append(separator)
}
builder.Append(item.ToString());
appendSeperator = true;
}
}
return builder.ToString();
}
Вам не хватает нулевой проверки последовательности и элементов последовательности. И да, это не самый быстрый и эффективный способ памяти. Можно было бы просто перечислить последовательность и отобразить строковые представления элементов в StringBuilder
. Но действительно ли это имеет значение? Вы испытываете проблемы с производительностью? Вам нужно оптимизировать?
null
коллекцию не имеет смысла. Проверка количества предметов в коллекции может быть хорошей.
Почему бы вам не использовать StringBuilder и выполнить итерацию в коллекции самостоятельно, добавив. В противном случае вы создаете массив строк (var string), а затем выполняете объединение.