2011-05-09 100 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那樣的擴展方法後面,情況都是如此。