ich ein String Aufbau basiert auf einer IEnumerable
, und so etwas wie dies zu tun:Iterieren über IEnumerable, spezielles Gehäuse letztes Element
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);
}
}
ich mit diesem Idiom nicht ganz zufrieden bin, aber ich bin zu kämpfen etwas prägnanter formulieren.
Dies ist natürlich ein Teil eines größeren String Gebäudebetrieb (wo es mehrere Blöcke ähnlich wie diese, sowie andere Sachen dazwischen) - sonst würde ich wahrscheinlich die StringBuilder
fallen und string.Join(", ", ...)
direkt verwenden.
Meine engsten Versuch, die oben zu vereinfachen, obwohl, wie dies Konstrukte für jede Iterator:
stringBuilder.Append(string.Join(", ", propertyNames.Select(prop => "[" + prop + "]")));
aber hier bin ich noch Saiten mit +
verketten, die es der StringBuilder
nicht tut das Gefühl, macht wirklich viel beitragen.
Wie kann ich diesen Code vereinfachen und gleichzeitig effizient halten?
Sie können 'prop => $" [{prop}] "' oder 'prop => string.Format (" [{0}] ", prop)' – Anton
Wenn Ihr Ziel ist, Speicherzuweisungen zu reduzieren, dann Sie können diesen Code nicht wirklich vereinfachen, so funktioniert der StringBuilder. Wenn der Inhalt der 'foreach'-Schleife viel größer ist, als Sie ihn in kleine Methoden für die Lesbarkeit aufteilen sollten, aber das ist alles, was Sie tun können –