我試圖用流利的接口來構建一個集合,類似這樣(簡體)例如:如何使用流暢的界面構建序列?
var a = StartWith(1).Add(2).Add(3).Add(4).ToArray();
/* a = int[] {1,2,3,4}; */
我能想出add添加(最好的解決方案)爲:
IEnumerable<T> Add<T>(this IEnumerable<T> coll, T item)
{
foreach(var t in coll) yield return t;
yield return item;
}
這似乎增加了每次調用中要重複的大量開銷。
有沒有更好的方法?
更新: 在我的衝刺中,我過分簡化了這個例子,並且忽略了一個重要的要求。現有coll中的最後一項影響下一個項目。所以,一個稍微不那麼簡單的例子:
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;
}
有趣的問題。但是,我不確定是否有更好的方法可以流利地做到這一點。你可以使'Add'方法帶一個'params'數組並且一次添加它們,但是這並不能真正回答這個問題。 – DavidG
我不認爲有。除非你保留一些內部緩衝,例如使用'ImmutableList'或類似的東西。 –