2010-06-18 17 views
78

null olduğu bir liste içinde tüm unsurları kaldırmak için C# için .NET tanımlanan varsayılan bir yöntem var mı?Tek seferde genel liste içindeki boş elemanlar nasıl kaldırılır?

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

en parametrelerden bazılarıdır null diyelim; Önceden bilemiyorum ve onları listemden çıkarmak istiyorum, böylece sadece null olmayan parametreler içermelidir.

cevap

160

Muhtemelen aşağıdaki isteyeceksiniz.

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 
parameterList.RemoveAll(item => item == null); 
+1

Evet, benim cevap ama yeni C# 3 lambda sözdizimi kullanılarak aynıdır. –

+0

@Mark: Gönderilen saniyeleri gördüm ve insanın yakın olduğunu gördüm (32, 33 ve 34). ;) – Lance

+0

Ha :) Eh, adil oyun - cevabınız neat sözdizimi kullandıysanız +1 –

21

RemoveAll yöntemi hile yapmak gerekir:

parameterList.RemoveAll(delegate (object o) { return o == null; }); 
+0

Neden lambda kullanmıyorsunuz? –

+8

Bu dört yaşındaki bir cevaptır. C# 3 nispeten yeni bir zamanda ve ben hala C# 2 gün-gün kullanıyordum. Lambda sözdizimi şimdi gitmek için yoldur; Ancak, bu hala çalışan bir cevaptır, ben de daha yeni sözdizimini (herhangi bir nedenle) kullanamayan herkes için burada bıraktım. –

+2

Lambda söz diziminin daha sonra geldiğini bilmiyordum. Açıklamanız için teşekkürler! Şüphesiz, geçerli. –

28

herhangi dahili yöntemin bilmiyorum, ama sadece linq kullanabilirsiniz:

parameterList = parameterList.Where(x => x != null).ToList(); 
+2

Gereksiz olarak yeni bir kopya oluşturacağından, 'parameterList' zaten bir Liste ise, bu durumdan kaçınılmalıdır. Bu durumda, diğerlerinin önerdiği gibi 'RemoveAll 'yöntemini kullanın. – Nick

+0

Toplama bir "Array" ise, bu muhtemelen en iyi seçenektir. – Andrew

3
List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

parameterList = parameterList.Where(param => param != null).ToList(); 
2

: yöntem OfType() boş değerler atlayacak 10
List<EmailParameterClass> parameterList = 
    new List<EmailParameterClass>{param1, param2, param3...}; 

IList<EmailParameterClass> parameterList_notnull = 
    parameterList.OfType<EmailParameterClass>(); 
+0

Bir bakıma, bu iyi bir yaklaşım, ama 'OfType'ın' belirli bir türdeki nesneleri seçtiğini düşünen, 'null' değerlerini içermeyeceğini düşünen geliştiriciye bir sürpriz getiriyor ... Bu yüzden ben ' Bunu kendi koduma eklemek için biraz yorgunum. –

+0

@ BjörnAliGöransson Anlaşıldı. Bu ilginç bir çözüm, ama çok açık bir şekilde "okunmuyor". Bir lambda ile .RemoveAll kullanarak hala her şeyi tek bir satırda tutar ve onu yazarken geliştiricinin neyi başarmaya çalıştığıyla ilgili olarak gerçekten bariz hale getirir. Ancak, bu, değerli bir hız avantajı varsa yararlı olabilir. – MattD

1

Kolay ve olmadan LINQ:

while (parameterList.Remove(null)) {}; 
+0

Bu yöntem 'RemoveAll 'in yanında bulunan' List 'sınıfındadır, bu yüzden bir tane için açıklık öneririm. Performans çok önemli olsaydı, bu yaklaşımla devam edebilirsiniz (parantezleri kaldırmam ve muhtemelen farkında olmayan geliştiricilere yorum ekleyeyim). – Andrew

+0

@Andrew: MSDN'ye göre, RemoveAll boş değil. Ben de bunu test ettim. Bir yorum olsa da mantıklı. –

+0

'RemoveAll 'bir' Predicate 'aldı, dolayısıyla kabul edilen ve Mark Bell'in yanıtında görüldüğü gibi' RemoveAll (x => x == null) 'seçeneğini kullanmalısınız. – Andrew

İlgili konular