假设我有一个IEnumerable(e)和一个T(t)值。最简单的方法是什么:
IEnumerable<T> newCollection = t+e
目前我正在做:
ItemArray = Enumerable.Repeat<object>(t, 1).Concat(e);
这是相当不可读的,因为我在这里没有真正重复。我也试过:
IEnumerable<T> newCollection = new List<object> { t}.Concat(e);
但是这个创建了一个不必要的 List 对象,它也不是最佳的。
有人有更好的主意吗?
在 MoreLINQ 中,我们有一个您可能感兴趣的Prepend
方法。所以你的代码将是:
ItemArray = e.Prepend(t);
编辑:在引擎盖下,Prepend
只做你当前代码做的事情 - 我真的只是建议将其重构为一种隐藏Repeat
/Concat
部分的方法,并给你留下更易读的调用代码。
Jon Skeet的答案在语义上是最有价值的。但是,如果您仍然想要一种内联方式,则可以使用隐式类型数组:
newCollection = new[] { t }.Concat(e);
尝试只创建一个简单的数组,而不是一个更复杂的对象 List。它可能更快:
IEnumerable<T> newCollection = new [] { t}.Concat(e);
我现在将告诉您,若要使用 Linq 添加此项,必须创建某种类型的新集合。这是因为 Linq 旨在处理可枚举项,并且因为它没有副作用;无论在 Linq 语句中执行什么操作,源枚举项都将保留在开始之前的状态(除非您正在处理具有枚举固有副作用的自定义集合)。结果是,在某种程度上,Linq 必须将单个项视为包含该项的集合,以便它可以枚举该集合以生成所需的任何输出。无论您是否将实现隐藏在扩展方法(如 MoreLINQ 中的扩展方法)后面,都是如此。