使用 LINQ 插入元素



假设我有一个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 中的扩展方法)后面,都是如此。

相关内容

  • 没有找到相关文章

最新更新