我试图用流利的接口来构建一个集合,类似这样(简体)例如:如何使用流畅的界面构建序列?
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'或类似的东西。 –