Genel bir listedeki tüm boş öğeler tek seferde nasıl kaldırılır?


112

Bir listedeki tüm öğeleri kaldırmak için .Net for C # 'de tanımlanmış varsayılan bir yöntem var mı null?

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

Diyelim ki bazı parametreler null; Önceden bilemiyorum ve onları sadece boş olmayan parametreleri içerecek şekilde listemden çıkarmak istiyorum.

Yanıtlar:


225

Muhtemelen aşağıdakileri isteyeceksiniz.

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

4
Evet, cevabımla aynı ama yeni C # 3 lambda sözdizimini kullanıyorum.
Mark Bell

@Mark: Gönderilen saniyeleri gördüm ve çok yakındı (32, 33 ve 34). ;)
Lance

1
Evet ... cevabınız eski sürümlerde bile işe yarıyor, yani +1! İşte orada, ha! ; Þ
Lance

43

Herhangi bir yerleşik yöntem bilmiyorum, ancak sadece linq'i kullanabilirsiniz:

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

5
parameterListZaten bir Liste ise, gereksiz yere yeni bir kopya oluşturacağından bundan kaçınılmalıdır . Bu durumda, RemoveAllyöntemi başkalarının önerdiği şekilde kullanın.
Nick

Koleksiyon bir .txt ise muhtemelen en iyi seçenek budur Array.
Andrew

25

RemoveAll yöntemi hile yapmalıdır:

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

Neden lambda kullanmıyorsunuz?
Mike de Klerk

12
Bu dört yıllık bir cevap. O zamanlar C # 3 nispeten yeniydi ve hala her gün C # 2 kullanıyordum. Lambda sözdizimi artık gidilecek yoldur; ancak, bu hala çalışan bir cevap, bu yüzden yeni sözdizimini kullanamayan herkes için (herhangi bir nedenle) burada bıraktım.
Mark Bell

2
Lambda sözdiziminin daha sonra geldiğinin farkında değildim. Açıklamanız için teşekkürler! Şüphesiz geçerlidir.
Mike de Klerk

8

Yöntem OfType(), boş değerleri atlayacak:

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

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

Bir bakıma, bu iyi bir yaklaşım, ancak değerleri OfTypeiçermeyeceğini düşünmeden, sadece belirli bir türden nesneleri seçtiğini düşünen geliştiriciye bir sürpriz getiriyor null... Bu yüzden bunu tanıtmak için biraz yoruldum kendi koduma.

@ BjörnAliGöransson Kabul. Bu ilginç bir çözüm, ancak çok net "okumuyor". .RemoveAll'ı bir lambda ile kullanmak, her şeyi tek bir satırda tutarken, onu yazan geliştiricinin neyi başarmaya çalıştığını gerçekten açık hale getirir. Bununla birlikte, değerli bir hız avantajı varsa bu yararlı olabilir.
MattD

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

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

2

Kolay ve LINQ olmadan:

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

Bu yöntem Listhemen yanında sınıfta RemoveAll, bu yüzden açıklık için bunu tavsiye ederim. Performans çok önemliyse, bu yaklaşımı uygulayabilirsiniz (parantezleri kaldırıp muhtemelen habersiz geliştiriciler için bir yorum eklememe rağmen).
Andrew

1
@Andrew: MSDN'ye göre RemoveAll boş almaz. Sanırım bunu da test ettim. Yine de bir yorum mantıklı.
Tobias Knauss

1
RemoveAllbir aldı Predicate, bu yüzden RemoveAll(x => x == null)kabul edildiğinde ve Mark Bell'in cevabında görüldüğü gibi kullanmalısın .
Andrew

1

Başka bir basit ve zarif seçenek daha var:

parameters.OfType<EmailParameterClass>();

Bu, türden olmayan tüm öğeleri kaldıracak ve bu türden EmailParameterClassherhangi bir öğeyi açıkça filtreleyecektir null.

İşte bir test:

class Test { }
class Program
{
    static void Main(string[] args)
    {
        var list = new List<Test>();
        list.Add(null);
        Console.WriteLine(list.OfType<Test>().Count());// 0
        list.Add(new Test());
        Console.WriteLine(list.OfType<Test>().Count());// 1
        Test test = null;
        list.Add(test);
        Console.WriteLine(list.OfType<Test>().Count());// 1
        Console.ReadKey();
    }
}

Bu işe yarayacak mı? öğe referansları hala tipte olmayacak EmailParameterClassve sadece null? a eşit bir değere sahip olmayacak .
derHugo

Kesinlikle olacak ve eğlenceniz için test cihazı ekledim.
Ryan Naccarato
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.