2013-01-03 8 views
25

Benim popuped IEnumerable<User> koleksiyonu var.Ürünü bir IEnumerable <T> koleksiyonundan kaldırmak istediğinizde

Bir öğeyi buradan kaldırmak istiyorum, bunu nasıl yapabilirim?

foreach(var u in users) 
{ 
    if(u.userId = 1123) 
    { 
    // remove! 
    } 
} 

Ben döngü sırasında kaldırmak için varsayalım değil senin biliyorum, bu yüzden yeni bir koleksiyon oluştururken veya sonrasında kaldırmadan ya umursamıyorum.

Ancak bir nedenden ötürü nasıl çıkarılacağını bilmiyorum, bu sebepten dolayı bir tür kayıp.

IEnumerable<User> modifiedUsers = new List<User>(); 

foreach(var u in users) 
{ 
    if(u.userId != 1233) 
    { 
     modifiedUsers.add ?????? 
    } 
} 

nasıl koleksiyonuna ekleyebilirsiniz: Ben de üzerinde karıştı

Alternatif olarak, nasıl gibi yeni bir koleksiyon oluşturabilir?

cevap

0

Yapamazsınız. IEnumerable<T> sadece yinelenebilir. İkinci örnekte

, size bir IEnumerable bir öğeyi kaldırmak olamaz bunun

foreach(var u in users.ToArray()) // ToArray creates a copy 
{ 
    if(u.userId != 1233) 
    { 
     users.Remove(u); 
    } 
} 
8

bir kopyası üzerinde yineleme orjinal koleksiyonundan kaldırabilirsiniz, sadece sayılabilir. Burada anlatıldığı gibi : plandaki nesne ICollection uygulayan varsa ekleyebilir ve öğeleri kaldırmak istiyorsanız, bir ICollection kullanmak zorunda http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

, belki denemek ve IEnumerable döküm olabilir, bu rotadan sadece çalışacaktır.

Daha fazla bilgi için bkz.
http://msdn.microsoft.com/en-us/library/92t2ye13.aspx

Sen rotadan sadece Lante tarafından belirttiği gibi, sizin IEnumerable gelen yeni bir liste oluşturabilirsiniz, ancak bu rotadan gerçek kullanım durumuna bağlı olarak "optimal altı", olabilir.
ICollection muhtemelen gitmek için bir yoldur.

4

IEnumerable'u List'a dönüştürmeyi deneyin. Bu noktada, öğeleri kaldırmak için List 's Remove yöntemini kullanabileceksiniz.

aşağıdaki yöntemlerle öğeyi alabilirsiniz Linq kullanarak Remove yöntemine bir param olarak iletin:

  • users.Single(x => x.userId == 1123)
  • users.First(x => x.userId == 1123)

kod aşağıdaki gibidir:

users = users.ToList(); // Get IEnumerable as List 

users.Remove(users.First(x => x.userId == 1123)); // Remove item 

// Finished 
+0

kullanabilirsiniz ama bir IEnumerable afterwords beklediğini şeye atayabilirsiniz? Onu en baştan yeniden başlatmalı mıyım? – loyalflow

+0

@ user1361315 elbette, List IEnumerable uygular, bu yüzden gerçekten IEnumerable – dutzu

28

Bu kaldırma değil LINQ ile bu eleman olmaksızın yeni bir dizi oluşturma t:

// remove 
users = users.Where(u => u.userId != 123).ToList(); 

// new list 
var modified = users.Where(u => u.userId == 123).ToList(); 
+0

'a dayandırabilirsiniz. Her iki durumda da yeni bir liste oluşturuyorsunuz. İlk örnek sadece referansın üzerine yazmaktadır. –

+0

evet, öyle mi? senin için çalışmıyor mu? – lante

+3

Terminoloji doğru değil. Bir öğeyi listeden kaldırmıyorsunuz, her iki örnekte de yeni bir liste oluşturuyorsunuz ve eski liste etkilenmeden kalır. İlk örneğinizde sadece referansın üzerine yazıyorsunuz, çünkü "kaldır" yanlış sonuçlandığını belirtiyor. Bunu açıklığa kavuşturmak için sorunuzu güncellemelisiniz. –

0

IEnumerable arabirim sadece olan, numaralandırılabilir - bu Add veya Remove için herhangi bir yöntem sağlayabilir veya hiç listesini değiştirmez.

arayüzü sadece bazı öğeleri üzerinde yineleme için bir yol sağlar

- Neden sadece IEnumerable

// Treat this like a list, not an enumerable 
List<User> modifiedUsers = new List<User>(); 

foreach(var u in users) 
{ 
    if(u.userId != 1233) 
    { 
     // Use List<T>.Add 
     modifiedUsers.Add(u); 
    } 
} 
için örtülü döküm olmadan kodunuzu kullanmayın IEnumerable böyle

List<T> olarak uygulayacak numaralandırma gerektiren çoğu uygulamaları

+0

Bunu değiştirmek zorundayım, daha sonra tekrar edilemeyen bir şeye iletmeliyim. – loyalflow

+0

Sonra değiştirmek ve geçmek - List 'beri' IEnumerable 'bekliyor Eğer bir yönteme bir' List 'geçemez hiçbir neden yoktur' 'IEnumerable ' türetilmiştir. Kovaryans kuralları nedeniyle oyunculara ihtiyacın olduğunu düşünmüyorum bile. – Charleh