2016-04-05 28 views
0

Tam sayıların bir listesi var. İçerisindeki liste tam sayı listesinden nasıl filtreleyebilirim?C# boş ise tamsayıların listesinin filtrelenmesi

Örneğin: - L = [[0,1,2], [], [1], [1,2,3]]. Linq kullanarak L = [[0,1,2], [1], [1,2,3]] almak için nasıl filtreleyebilirim?

Burada [0,1,2] tam sayıların listesi bulunmaktadır.

Bu, önceki sorum ile ilgilidir. Tam sayıların listesini döndüren bir yinelemeli fonksiyonum var ve boş listeleri filtrelemem gerekiyor.

 int [] num_list = new int[10]{2, 3, 5, 9, 14, 19, 23, 45, 92, 100}; 

     public List<List<int>> find_solutions(int n, int t, int w) 
     { 

      if (n == 2) 
      { 
       List<int> s = new List<int>(); 
       for (var i=0; i <= t; i++) 
       { 
        if (i * num_list[1] + (t - i) * num_list[0] == w) 
        { 
         s.Add(i); 
         s.Add(t - i); 
        } 
       } 
       return new List<List<int>> { s }; 
      } 

      List<List<int>> f = new List<List<int>>(); 
      List<List<int>> temp_list = new List<List<int>>(); 
      for (int i=0; i <= Math.Min(t, w/num_list[n-1]); i++) 
      { 

       temp_list = find_solutions(n - 1, t - i, w - i * num_list[n - 1]); 

       // I strongly believe that i am getting empty list 
       // and I should filter out empty list form temp_list 
       // and I need to insert 'i' to each list inside list 

       foreach(List<int> c in temp_list) 
       { 
        c.Insert(0, i); 
       } 
       f.addRange(temp_list); 
      } 
      return f; 
     } 

cevap

0

Sen Where() kullanarak ve Count soran filtre: Herhangi boş girişlerini filtrelemek için Where ve Any kullanabilirsiniz

var list = new List<List<int>>(); 
... 


list = list.Where(l => l.Count > 0).ToList(); 
1
int[][] allLists = new int[][] { new int[] { 0, 1, 2 }, new int[] { }, 
    new int[] { 1 }, new int[] { 1, 2, 3 } }; 

int[][] nonEmtpy = allLists.Where(list => list.Any()).ToArray(); 

.

0

Bunu beğendiniz mi?

L.Where(i => i.Count() > 0).ToList() 
1
var listOfLists = L; //To use a better name for L 
var nonEmptyLists = listOfLists.Where(innerList => innerList.Any()); 

Bu sürekli tekrarlanması ve/veya gerekirse ToList veya ToArray çağırabilir

+1

Er ... Sanırım burada büyük ve küçük harflerinizi karıştırıyorsunuz. –

+0

@JoachimIsaksson: Bu arkadaş için teşekkürler, şimdi düzeltildi. –

1

aşağıdaki şekillerde bunu başarabilirsiniz:

L.Where(p=>p.Any()).ToList(); 
L.Where(p=>p.Count > 0).ToList(); 

Count özelliğini için optimize edilmiştir ICollection<T> Burada T bir türüdür. Herhangi bir() bir numaralayıcı oluşturmak zorundadır. Bu nedenle, Count özelliği, Any() yönteminden daha hızlıdır.

+0

'Count' daha hızlıdır, ancak' Any() 'daha temizdir. Ben bir öğe ile bir liste basit bir kontrol profilli, 100,000,000 'den fazla kontrol 'Count' çıkıyor ~ 30ms' Any() 'dışarı çıkıyor ~ 3100. Bunun anlamı, Say (-) saatinin% 1'inde çalışır. Ancak Listeler (veya diziler) için optimize etmek için iyi bir nedenim olmadıkça ve (_knew_) işlemciden her çıkıntıyı sıkıştırmak için ihtiyacım olmadığı sürece Any() öğesini tercih ederim. –

+0

kimler için daha net? İşlemci ya sen? ;) –

+0

En önemlisi olan kişiye, kod arayan kişi daha net. –

İlgili konular