2011-05-09 111 views
1

鉴于我有一个IEnumerable(e)和单个值T(t)。什么是做的最简单的方法:目前我在做LINQ插入元素

IEnumerable<T> newCollection = t+e 

:这是相当不可读的,因为我'在这里做不实重复

ItemArray = Enumerable.Repeat<object>(t, 1).Concat(e); 

。 我也试过:

IEnumerable<T> newCollection = new List<object> { t}.Concat(e); 

但是这一次创建了一个不必要的List对象也并非最佳。

有没有人有更好的主意?

回答

3

Jon Skeet的答案在语义上最有价值。但是,如果你还是想办法做到这一点在线,您可以使用隐式类型数组:

newCollection = new[] { t }.Concat(e); 
6

MoreLINQ我们有一个Prepend你可能有兴趣采取的方法。所以,你的代码将是:

ItemArray = e.Prepend(t); 

编辑:引擎盖下,Prepend只做你当前的代码做什么 - 我真的只是表明它重构到隐藏Repeat/Concat部分的方法,以及让你具有更多可读的调用代码。

+0

显然prepend方法只是他在第二个codestub中做同样的事情的包装。 – 2011-05-09 15:03:50

+1

@是另一个极客:是的,但请注意,反对意见是*可读性*,而不是任何语义。将编辑虽然... – 2011-05-09 15:05:53

2

而不是列表,这是一个更复杂的对象,尝试创建只是一个简单的数组。它可能会更快:

IEnumerable<T> newCollection = new [] { t}.Concat(e); 

我会告诉你,现在,使用Linq添加这个项目,你必须创建某种类型的新的集合。这是因为Linq被设计用于枚举类型,并且因为它是无副作用的;无论你在Linq声明中做什么,源枚举都保持原来的状态(除非你正在处理一个自定义集合,它具有列举它的固有副作用)。结果是,在某种程度上,Linq必须将您的单个项目视为一个包含该项目的集合,以便它可以通过该集合进行枚举以产生您所期望的任何输出。无论您将实现隐藏在像MoreLINQ那样的扩展方法后面,情况都是如此。