2009-10-22 19 views
8

Son zamanlarda LINQ ile ilgili bir röportaj sorusu ile karşı karşıya kaldım.LINQ'de Boş Sıra

Boş dizinin kullanımı nedir? "Eğer sizden hangisini kullanacağınızı soruyorsam, nereye sığarsınız?"

 public static IEnumerable<TResult> Empty<TResult>() 
    { 
     yield break; 
    } 

Cevap vermedim.

+2

nasıl boş sırası oluşur Birliğe yöntemi ekleyin, ancak diyebiliriz diyemezsin Birliği bir Liste olmadığı için kullanımı? Nasıl takıyorsun? Bence iyi bir soru için – Will

+0

+1. –

+0

@Stan Şüphemden kurtulmak için size çok teşekkür ederim. –

cevap

3

Bunu kullanabilir.

List<string[]> namesList = 
    new List<string[]> { names1, names2, names3 }; 

// Only include arrays that have four or more elements 
IEnumerable<string> allNames = 
    namesList.Aggregate(Enumerable.Empty<string>(), 
    (current, next) => next.Length > 3 ? current.Union(next) : current); 

Not Bir IEnumerable

+0

Yinelenmeleri gerçekten hariç tutmanız gerekmedikçe, Birlik yerine Concat kullanarak daha iyi performans elde edebilirsiniz. –

+2

LINQ kullanarak böyle bir liste listesine katılmanın en hızlı yolu, namesList.SelectMany (list => list.Length> 4? Listedir: Enumerable.Empty ()) Distinct(). Agrega ve Birlik ile yapmak son derece verimsiz. Agrega ve Concat daha iyidir ama yine de O (Nsquared) ve O (N) alanıdır. SelectMany/Distinct, O (N) ve O (1) boşluğudur (sadece 3 nesne oluşturulur). –

4

Farklı kümeleri bir araya getirerek bir sonuç kümesinde toplanan bir döngü varsa, sonuç kümesi değişkeninizi ve döngü/biriktirmeyi başlatmak için kullanabilirsiniz. Örneğin: Bu sadece bir döngü senaryosu olmak zorunda değildir

IEnumerable<string> results = null; 

for(....) 
{ 
    IEnumerable<string> subset = GetSomeSubset(...); 

    if(results == null) 
    { 
     results = subset; 
    } 
    else 
    { 
     results = results.Union(subset); 
    } 
} 

ve öyle değil:

IEnumerable<string> results = Enumerable.Empty<string>(); 

for(....) 
{ 
    IEnumerable<string> subset = GetSomeSubset(...); 

    results = results.Union(subset); 
} 

Boş olmadan size döngü mantığı içine boş bir çek yazdım olurdu Birlik olmalı (herhangi bir toplama fonksiyonu olabilir), ama bu daha yaygın örneklerden biridir. hızlı bir IEnumerable<T> Yeni List<T> için bir referans oluşturabilir ve verim anahtar kelime yararlanmak gerek yok bu şekilde oluşturmak istediğinizde

+0

Çok teşekkür ettim çok teşekkür ederim mükemmel örnek –

+0

Sorunun iyi cevabı. Okuyucular, yukarıdaki performans yorumumun bu kod için de geçerli olduğunu not etmelidir. Sendikayı bu şekilde kullanmak O (Nsquared) 'dır çünkü her birlik için bir Set oluşturur ve şimdiye kadar bütün dizelerle doldurur. Sanırım bu teknik olarak O (NM). Çok yavaş olduğu ve SelectMany/Distinct'ın bu tür bir senaryo için daha iyi olduğu nokta. –