2016-03-31 26 views
3

Mevcut bir liste tüm alt listelerin bir enumerator çıkın ve ben örneğin tüm olası alt listeleri elde etmek istiyorum: Ben <code>List<T></code> var

[A, B, C, D, E] => [[A], [A, B], [A, B, C], [A, B, C, D], [A, B, C, D, E]] 

LINQ ile bu yeni enumerable elde yapmanın kolay bir yolu var mı Nesneler

DÜZENLEME 1: Ben sadece "öneki listeleri" istemek Not mümkün olan tüm permütasyon (yani gösterilen örnek sonuç zaten tamamlandığında) değil.

EDIT 2: Öğelerin sırasını da korumak istediğimi unutmayın.

DÜZENLEME 3: kaynak yineleme sadece bir kez yerine birden çok kez bakış tür dönerek yerine örneğin O (n²), (n) O içinde enumerable elde etmek için bir yol var Her seferinde yeni bir liste yerine verilerde?

+0

web & cd = 1 & cad = RJA & uact = 8 & ved = 0ahUKEwiS9afz1erLAhUDtRoKHS0KC7gQFgggMAA & url = http% 3A% 2F% 2Fericlippert.com% 2F2013% 2F04% 2F15% 2Fproducing-permütasyon-yarı bir% 2F & usg = AFQjCNELiYNC3091lbttaXec9OFgUqEAAw) –

+1

sorum permütasyon olmak görünmüyor, örneğin, [B, A] 'ile ilgilenmiyorum. –

+0

@Yuval Izzchakov: lütfen sorumu tekrar açın, yinelenmez, teşekkür ederim. –

cevap

4

Çok naif uzatma yöntemi:

public static class Extensions 
{ 
    public static IEnumerable<IEnumerable<T>> GetOrderedSubEnumerables<T>(
               this IEnumerable<T> collection) 
    { 
     var builder = new List<T>(); 
     foreach (var element in collection) 
     { 
      builder.Add(element); 
      yield return builder; 
     } 
    } 
} 

Kullanım:

void Main() 
{ 
    var list = new List<string> { "A", "B", "C", "D", "E" }; 
    Console.WriteLine(list.GetOrderedSubEnumerables()); 
} 

Sonuç: Eğer koleksiyon yineleme olarak bu verilerinizin görüşlerini dönecektir

Not . Ancak, her bir permürasyonu ayrı ayrı tüketmeniz gerekiyorsa, her bir List<T>'u geri vermeden önce kopyalamanız gerekir. Bu durumda, bunu yapmak gerekir: [Eric Lippert tarafından permütasyon] hakkında güzel bir blog (https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source= yoktur

public static class Extensions 
{ 
    public static IEnumerable<IEnumerable<T>> GetOrderedSubEnumerables<T>(
               this IEnumerable<T> collection) 
    { 
     var builder = new List<T>(); 
     foreach (var element in collection) 
     { 
      builder.Add(element); 
      var local = new List<T>(builder); 
      yield return local; 
     } 
    } 
} 
+0

Ben senin çözümünü beğeniyorum :) +1 –

+0

@ EʜsᴀɴSᴀᴊᴊᴀᴅ Teşekkürler :) –

+0

'' getiri iadesi'' yeni bir IEnumerable oluşturmak için neden olur? –

0

Evet, haklısınız, gereğiniz artık permütasyonlarla ilgisi olmayan küçük bir permütasyon kümesidir. Yani burada benim öneri:

var result = Enumerable.Range(1, list.Count). 
       Select(i => list.Take(i).ToList()). 
       ToList(); 
0

Listenizdeki öğelerin sayısı bir dizi üzerinde yineleme ve şöyle alt listesini seçebilirsiniz: Veri değilse o

var list = new List<string> { "A", "B", "C", "D", "E"}; 

var query = 
    from i in Enumerable.Range(1, list.Count) 
    select list.Take(i); 

unutmayın Bir List<T>Count pahalı olabilir. Ayrıca, verilerinizi birden çok kez tekrarladığını unutmayın.

İlgili konular