एक सूची में एक सामान्य सूची के अंदर सभी अशक्त तत्वों को कैसे हटाया जाए?


112

क्या किसी सूची के भीतर सभी तत्वों को हटाने के लिए C # के लिए एक डिफ़ॉल्ट विधि परिभाषित की गई है जो हैं null?

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

मान लीजिए कि कुछ पैरामीटर हैं null; मैं पहले से नहीं जान सकता और मैं उन्हें अपनी सूची से हटाना चाहता हूं ताकि इसमें केवल ऐसे पैरामीटर हों जो अशक्त न हों।

जवाबों:


225

आप शायद निम्नलिखित चाहेंगे।

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

4
हां, यह मेरे उत्तर के समान है लेकिन नए C # 3 लंबो सिंटैक्स का उपयोग कर रहा है।
मार्क बेल

@ मर्क: मैंने पोस्ट किए गए सेकंड देखे और आदमी यह करीब (32, 33 और 34) था। ;)
लांस

1
हाँ ... अच्छा तो आपका उत्तर पुराने संस्करणों में भी काम करता है इसलिए +1! तो वहाँ, हा! ; Ance
लांस

43

मैं किसी भी अंतर्निर्मित विधि के बारे में नहीं जानता, लेकिन आप सिर्फ linq का उपयोग कर सकते हैं:

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

5
यदि parameterListपहले से सूची है, तो इसे टाला जाना चाहिए , क्योंकि यह अनावश्यक रूप से एक नई प्रतिलिपि बनाएगा। उस मामले में RemoveAllविधि का उपयोग करें जैसा कि अन्य सुझाव देते हैं।
निक

यह शायद सबसे अच्छा विकल्प है अगर संग्रह ए है Array
एंड्रयू

25

RemoveAll विधि को चाल करना चाहिए:

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

मेमने का उपयोग क्यों नहीं करते?
माइक डी क्लार्क

12
यह चार साल पुराना जवाब है। उस समय C # 3 अपेक्षाकृत नया था, और मैं अभी भी C # 2 दिन-प्रतिदिन का उपयोग कर रहा था। लंबोदर सिंटैक्स अब जाने का रास्ता है; हालाँकि, यह अभी भी एक कार्यशील उत्तर है, इसलिए मैंने इसे नए वाक्यविन्यास (जो भी कारण हो) का उपयोग करने में असमर्थ किसी भी व्यक्ति के लिए यहाँ छोड़ दिया है।
मार्क बेल

2
मुझे नहीं पता था कि बाद में लंबोदर सिंटैक्स आया था। आपके विवरण के लिए धन्यवाद! एक शक के बिना यह वैध है।
माइक डी क्लार्क

8

विधि OfType()शून्य मानों को छोड़ देगी:

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

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

एक तरह से, यह एक अच्छा दृष्टिकोण है, लेकिन यह डेवलपर के लिए एक आश्चर्य की बात लाता है जो सिर्फ यह सोचता है कि OfTypeएक निश्चित प्रकार की वस्तुओं का चयन करता है, यह सोचकर नहीं कि इसमें nullमूल्य शामिल नहीं होंगे ... इसलिए मैं इसे पेश करने के लिए थोड़ा थका हुआ हूं मेरे अपने कोड में।

@ ब्योर्नअलीग्रेन्सन सहमत। यह एक दिलचस्प समाधान है, लेकिन यह बहुत स्पष्ट रूप से "पढ़ा" नहीं है। का उपयोग करना। एक lambda के साथ .RemoveAll अभी भी एक ही लाइन पर सब कुछ रखता है, जबकि यह वास्तव में स्पष्ट है कि डेवलपर ने जो लिखा था वह हासिल करने की कोशिश कर रहा था। हालाँकि, यह उपयोगी हो सकता है अगर वहाँ एक गति लाभ है कि सार्थक है।
20


2

आसान और बिना LINQ:

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

यह विधि Listकक्षा के बगल में है RemoveAll, इसलिए मैं स्पष्टता के लिए एक की सिफारिश करूंगा। यदि प्रदर्शन महत्वपूर्ण हुआ, तो आप इस दृष्टिकोण के साथ जा सकते हैं (हालांकि मैं कोष्ठक हटाऊंगा और शायद अनजान डेवलपर्स के लिए एक टिप्पणी जोड़ूंगा)।
एंड्रयू

1
@ और: MSDN के अनुसार, RemoveAll शून्य नहीं लेता है। मुझे लगता है कि मैंने भी इसका परीक्षण किया है। एक टिप्पणी हालांकि समझ में आता है।
टोबियास ने क्ले

1
RemoveAllएक प्राप्त किया है Predicate, तो आप का उपयोग करना चाहिए RemoveAll(x => x == null), के रूप में स्वीकार किए जाते हैं और मार्क बेल के जवाब में देखा।
एंड्रयू

1

एक और सरल और सुरुचिपूर्ण विकल्प है:

parameters.OfType<EmailParameterClass>();

यह उन सभी तत्वों को हटा देगा EmailParameterClassजो प्रकार के नहीं हैं जो स्पष्ट रूप से किसी भी प्रकार के तत्वों को फ़िल्टर करेंगे null

यहाँ एक परीक्षण है:

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();
    }
}

यह काम करेगा? तत्व संदर्भ अभी भी प्रकार के नहीं होंगे EmailParameterClassऔर केवल एक मूल्य के बराबर होगा null?
derHugo

यह निश्चित रूप से होगा और मैंने आपके मनोरंजन के लिए परीक्षक जोड़ा।
रेयान नैकराटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.