2010-08-20 17 views
24

İki dizim varsa ve bunları birlikte işlemek istiyorsanız, onları birleştirebilirim ve gideriz.'Union' a tek bir öğe için daha iyi bir linux yolu var mı?

Şimdi, iki sekans arasında işlem yapmak istediğim tek bir öğem olduğunu varsayalım. Tek bir öğeyle bir dizi oluşturarak alabilirim, ancak daha iyi bir yol var mı? yani

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); 

Bunu yapmanın bir onaylı yolu var mı, yoksa bu onaylı yoludur?

+1

.. mutlu hissetmiyorum ama bir örtük dönüştürme yazmak için bir yol varsa o .. Wonder etrafında çalışmaya değer olduğunu düşündüm asla gelmez T ve T dizisi arasında .. –

+0

olası yinelenen [Yeni bir IEnumerable dizisi oluşturmak için en sevdiğiniz yol tek bir değerden mi?] (http://stackoverflow.com/questions/1019737/favorite-way-to-create-an- new-ienumerablet-sequence-from-a-tek-değer) – nawfal

+1

Sadece yeni dizgiyi [] yeni [] ile azaltarak sendika ifadesini basitleştirebilirsiniz. Aksi takdirde, Jon Hanna'nın çözümü, bu türden bir şeyi sık sık yaparsanız, muhtemelen bunu yapmanın en iyi yolu. –

cevap

32

Bir seçenek kendiniz aşırı etmektir

Teşekkür: Biz MoreLINQ içinde Concat ile bunu yaptık

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

. o col.Union(obj) olarak col.Union(obj.EmitFromEnum()); aramaya gibi düzgün olmasa da

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

bu tek uzantı yöntemi böyle tek isteyebilirsiniz diğer tüm durumlarda kapsar demek:

+1

Enumerable.Repeat, mükemmel, teşekkürler. Bu aşırı yükü kullanabilirim, teşekkürler. –

+1

Daha fazla içgüdü için, 'cons' aşırı yükünü adlandırın: D –

+2

Her sık ​​sık, C# kodu yazarken, set işlem operatörleri için F # veya LISP gibi dillerden özlem duyuyorum. "List :: item" veya "list1 @ list2" gibi sözdizimi, onlara alıştıktan sonra oldukça okunabilir olma eğilimindedir. – LBushkin

1

yerde benim kodunda aşağıdaki sahip olma eğilimindedir -em sayımı.

+1

'genel statik IEnumerable EmitFromEnum (bu T öğesi) { dönüş değeri ürün; } ' –

+0

@KuganKumar Yup. Teşekkürler. –

5

daha esnek bir yaklaşım kullanmayı düşünün: Tek yanı sıra birden çok öğe için

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

Çalışır. Ayrıca boş source değerleri kabul edilebilir: Bu bunu yapmak eğilimindedir nasıl

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items) 
{ 
    return source != null ? source.Union((IEnumerable<T>)items) : items; 
} 
İlgili konular