Ich versuche, eine fließend-Schnittstelle mit einer Sammlung, ähnlich wie dieses (vereinfachte) Beispiel bauen:Wie erstellt man eine Sequenz mit einer fließenden Schnittstelle?
var a = StartWith(1).Add(2).Add(3).Add(4).ToArray();
/* a = int[] {1,2,3,4}; */
Die beste Lösung, die ich mit add kommen kann() als:
IEnumerable<T> Add<T>(this IEnumerable<T> coll, T item)
{
foreach(var t in coll) yield return t;
yield return item;
}
Das scheint eine Menge Overhead hinzuzufügen, der bei jedem Anruf wiederholt wird.
Gibt es einen besseren Weg?
UPDATE: in meiner Eile habe ich das Beispiel zu stark vereinfacht und eine wichtige Anforderung weggelassen. Der letzte Eintrag in der vorhandenen Spalte beeinflusst den nächsten Eintrag. Also, ein etwas weniger vereinfachtes Beispiel:
var a = StartWith(1).Times10Plus(2).Times10Plus(3).Times10Plus(4).ToArray();
/* a = int[] {1,12,123,1234}; */
public static IEnumerable<T> StartWith<T>(T x)
{
yield return x;
}
static public IEnumerable<int> Times10Plus(this IEnumerable<int> coll, int item)
{
int last = 0;
foreach (var t in coll)
{
last = t;
yield return t;
}
yield return last * 10 + item;
}
Interessante Frage. Ich bin mir jedoch nicht sicher, ob es einen besseren Weg gibt, dies fließend zu machen. Sie könnten die 'Add'-Methode dazu bringen, ein' params'-Array zu verwenden und alle auf einmal hinzuzufügen, aber das beantwortet die Frage nicht wirklich. – DavidG
Ich glaube nicht, dass es da ist. Außer wenn Sie eine interne Pufferung behalten, zum Beispiel mit 'ImmutableList' oder etwas ähnliches. –