2010-08-20 15 views
24

如果我有兩個序列,並且我想一起處理它們,我可以將它們結合起來並離開我們去。是否有一個整潔的linq方式來「聯合」單個項目?

現在可以說我有我希望兩個sequencs之間處理一個項目。我可以通過創建一個包含單個項目的數組來獲得它,但有沒有更好的方法?即

var top = new string[] { "Crusty bread", "Mayonnaise" }; 
string filling = "BTL"; 
var bottom = new string[] { "Mayonnaise", "Crusty bread" }; 

// Will not compile, filling is a string, therefore is not Enumerable 
//var sandwich = top.Union(filling).Union(bottom); 

// Compiles and works, but feels grungy (looks like it might be smelly) 
var sandwich = top.Union(new string[]{filling}).Union(bottom); 

foreach (var item in sandwich) 
    Process(item); 

是否有這樣做的批准方式,或者這是批准的方式嗎?

感謝

+1

這是我傾向於做..沒有感到不開心,但從來沒有想通這是值得各地工作..不知道是否有寫的隱式轉換的方式T和T陣列..的 – 2010-08-20 15:15:03

+0

可能重複之間[收藏的方式來創建從一個單一的值的新的IEnumerable 序列?](http://stackoverflow.com/questions/1019737/favorite-way-to-create-an- new-ienumerablet-sequence-from-a-single-value) – nawfal 2013-02-17 12:32:57

+1

通過將new string []減少爲new [],可以簡化聯合表達式。否則,如果你最終經常這樣做,Jon Hanna的解決方案可能是最好的解決方法。 – 2014-11-14 19:18:38

回答

32

一種選擇是自己重載它:

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, T item) 
{ 
    return source.Union(Enumerable.Repeat(item, 1)); 
} 

這就是我們在做MoreLINQConcat

+1

Enumerable.Repeat,完美,謝謝。我確實可以使用這種超載,謝謝。 – 2010-08-20 15:12:33

+1

對於額外的nerdiness,命名超載'cons':d – 2010-08-20 15:13:40

+2

每隔一段時間,編寫C#代碼時,我發現自己渴望從像F#或LISP語言設置操作運營。類似於'list :: item'或'list1 @ list2'的語法一旦習慣了它們,它們就會非常易讀。 – LBushkin 2010-08-20 15:49:46

1

我往往有地方在我的代碼如下:

public static IEnumerable<T> EmitFromEnum<T>(this T item) 
{ 
    yield return item; 
} 

雖然它不是整齊調用col.Union(obj.EmitFromEnum());作爲col.Union(obj)它確實意味着,這種單一的擴展方法涵蓋所有​​其他情況下,我可能希望這種單-item枚舉。

+1

'公共靜態的IEnumerable EmitFromEnum (該T項) { 收率返回項; }' – 2018-02-22 23:17:32

+0

@KuganKumar Yup。謝謝。 – 2018-02-22 23:19:52

5

考慮採用更靈活的方法:

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items) 
{ 
    return source.Union((IEnumerable<T>)items); 
} 

工程單以及多個項目。 您也可以接受空source值:

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items) 
{ 
    return source != null ? source.Union((IEnumerable<T>)items) : items; 
} 
相關問題