জেনেরিক তালিকার ভিতরে সমস্ত নাল উপাদানগুলি কীভাবে একসাথে সরানো যায়?


112

কোন তালিকার মধ্যে থাকা সমস্ত উপাদান অপসারণ করতে সি # এর জন্য নেট কি কোনও ডিফল্ট পদ্ধতি নির্ধারণ করা আছে 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
হ্যাঁ, এটি আমার উত্তর হিসাবে একই তবে নতুন সি # 3 লাম্বদা সিনট্যাক্স ব্যবহার করে।
মার্ক বেল

@ মার্ক: আমি পোস্ট করা সেকেন্ড দেখেছি এবং লোকটি এটি কাছাকাছি ছিল (32, 33 এবং 34)। ;)
ল্যান্স

1
হ্যাঁ ... ভাল আপনার উত্তর এমনকি পুরানো সংস্করণে কাজ করে তাই +1! তো, হা! ;।
ল্যান্স

43

আমি অন্তর্নির্মিত কোনও পদ্ধতি সম্পর্কে জানি না, তবে আপনি কেবল লিনক ব্যবহার করতে পারেন:

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

5
parameterListইতিমধ্যে একটি তালিকা থাকলে এটি এড়ানো উচিত , কারণ এটি অযথা নতুন কপি তৈরি করে। সেক্ষেত্রে RemoveAllঅন্যদের পরামর্শ মতো পদ্ধতিটি ব্যবহার করুন ।
নিক

সংগ্রহটি যদি হয় তবে এটি সম্ভবত সেরা বিকল্প Array
অ্যান্ড্রু

25

সরানোর সমস্ত পদ্ধতিটি কৌশলটি করা উচিত:

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

লাম্বদা কেন ব্যবহার করবেন না?
মাইক ডি ক্লার্ক

12
এটি একটি চার বছরের পুরানো উত্তর। সেই সময় সি # 3 অপেক্ষাকৃত নতুন ছিল এবং আমি এখনও সি # 2 দিনের পর দিন ব্যবহার করছিলাম। ল্যাম্বদা সিনট্যাক্স এখন যাওয়ার উপায়; তবে এটি এখনও একটি কার্যকরী উত্তর, সুতরাং যে কেউ নতুন সিনট্যাক্স ব্যবহার করতে না পারার জন্য (যে কারণেই হোক না কেন) আমি এটি এখানে রেখেছি।
মার্ক বেল

2
আমি জানতাম না যে ল্যাম্বদা সিনট্যাক্সটি পরে এসেছিল। তোমার ব্যাখার জন্য ধন্যবাদ! সন্দেহ ছাড়াই এটি বৈধ।
মাইক ডি ক্লার্ক

8

পদ্ধতিটি OfType()নাল মানগুলি এড়িয়ে যাবে:

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

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

একরকম, এটি একটি ভাল পদ্ধতি, তবে এটি বিকাশকারীদের জন্য আশ্চর্য হয়ে আসে যিনি কেবল মনে করেন যে এটি OfTypeকোনও নির্দিষ্ট ধরণের অবজেক্ট নির্বাচন করে, এতে nullভ্যালু অন্তর্ভুক্ত হবে না এমন ভেবে না ... সুতরাং আমি এটি পরিচয় করিয়ে দিতে কিছুটা ক্লান্ত হয়ে পড়েছি আমার নিজের কোডে

@ BjörnAliGöransson সম্মত। এটি একটি আকর্ষণীয় সমাধান, তবে এটি খুব স্পষ্টভাবে "পড়া" হয় না। যে বিকাশকারী এটি লিখেছিল সে কী অর্জন করতে চেয়েছিল তা সত্যই স্পষ্ট করে তুলতে ল্যাম্বডা সহ সমস্ত সরান এখনও একটি একক লাইনে রাখে। তবে, যদি গতি উপকারের পক্ষে সার্থক হয় তবে এটি কার্যকর হতে পারে।
ম্যাটডি


2

লিনকু ছাড়া সহজ এবং

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

এই পদ্ধতিটি Listক্লাসে একেবারে পাশেই রয়েছে RemoveAll, সুতরাং আমি স্পষ্টতার জন্য এটির প্রস্তাব দিই। যদি পারফরম্যান্সটি গুরুত্বপূর্ণ হয়ে পড়ে, তবে আপনি এই পদ্ধতির সাথে যেতে পারেন (যদিও আমি বন্ধনীগুলি সরিয়ে ফেলব এবং সম্ভবত অজানা বিকাশকারীদের জন্য একটি মন্তব্য যুক্ত করব)।
অ্যান্ড্রু

1
@ অ্যান্ড্রু: এমএসডিএন অনুসারে, সরানআলগুলি শূন্য করে না। আমি মনে করি আমি এটিও পরীক্ষা করে দেখেছি। একটি মন্তব্য যদিও বুদ্ধিমান হয়।
টোবিয়াস কানৌস

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

এটি অবশ্যই হবে এবং আমি আপনার বিনোদনের জন্য পরীক্ষক যুক্ত করেছি।
রায়ান ন্যাকারতো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.