Я строю строку на основе IEnumerable
, и делать что-то вроде этого:Перебор IEnumerable, специальный кожух последний элемент
public string BuildString()
{
var enumerable = GetEnumerableFromSomewhere(); // actually an in parameter,
// but this way you don't have to care
// about the type :)
var interestingParts = enumerable.Select(v => v.TheInterestingStuff).ToArray();
stringBuilder.Append("This is it: ");
foreach(var part in interestingParts)
{
stringBuilder.AppendPart(part);
if (part != interestingParts.Last())
{
stringBuilder.Append(", ");
}
}
}
private static void AppendPart(this StringBuilder stringBuilder, InterestingPart part)
{
stringBuilder.Append("[");
stringBuilder.Append(part.Something");
stringBuilder.Append("]");
if (someCondition(part))
{
// this is in reality done in another extension method,
// similar to the else clause
stringBuilder.Append(" = @");
stringBuilder.Append(part.SomethingElse");
}
else
{
// this is also an extension method, similar to this one
// it casts the part to an IEnumerable, and iterates over
// it in much the same way as the outer method.
stringBuilder.AppendInFilter(part);
}
}
Я не совсем доволен этой идиомы, но я изо всех сил сформулировать что-то более сжатое.
Это, конечно же, часть более крупной операции по строительству струн (там, где есть несколько блоков, подобных этому, а также другие вещи между ними). В противном случае я бы, вероятно, отказался от StringBuilder
и сразу использовал string.Join(", ", ...)
.
Моя ближайшая попытка упрощения выше, однако, конструкции, как это для каждого итератора:
stringBuilder.Append(string.Join(", ", propertyNames.Select(prop => "[" + prop + "]")));
, но здесь я все еще конкатенация строк с +
, что делает его чувствовать, что StringBuilder
не действительно много способствуют.
Как я могу упростить этот код, сохраняя при этом его эффективность?
Вы можете использовать 'prop => $" [{prop}] "или' prop => string.Format ("[{0}]", prop) ' – Anton
Если ваша цель - уменьшить выделение памяти, тогда вы не можете действительно упростить этот код, так работает StringBuilder. Если содержимое цикла foreach намного больше, чем вы должны разделить его на небольшие методы для удобочитаемости, но это все, что вы можете сделать. –