সি # তে তালিকা থেকে আইটেমটি কীভাবে সরাবেন?


190

ফলাফলের তালিকায় আমার নীচের মতো তালিকা রয়েছে:

var resultlist = results.ToList();

এটি দেখতে এমন কিছু দেখাচ্ছে:

ID FirstName  LastName
-- ---------  --------
1  Bill       Smith
2  John       Wilson
3  Doug       Berg

আমি তালিকা থেকে আইডি 2 কীভাবে সরিয়ে দেব?

উত্তর:


365

List<T> আপনি ব্যবহার করতে পারেন দুটি পদ্ধতি আছে।

আপনি যদি আইটেমের সূচি জানেন তবে সরানএট (ইনটেক্স) ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ:

resultlist.RemoveAt(1);

অথবা আপনি সরান (টি আইটেম) ব্যবহার করতে পারেন :

var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);

আপনি যখন নিশ্চিত হন না যে আইটেমটি সত্যই উপস্থিত রয়েছে আপনি সিঙ্গেলঅরডিফল্ট ব্যবহার করতে পারেন । কোনও আইটেম না থাকলে SingleOrDefaultফিরে আসবে null( Singleযখন আইটেমটি এটি খুঁজে না পাবে তখন একটি ব্যতিক্রম ছুঁড়ে ফেলবে)। যখন একটি সদৃশ মান (একই সঙ্গে দুটি আইটেম id) থাকবে তখন উভয়ই নিক্ষেপ করবে ।

var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
    resultList.Remove(itemToRemove);

5
ভাল, সম্ভবত তুলনায়var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
ভ্লাদ

1
এই হওয়া উচিত নয় resultlist.Items.RemoveAt(1);?
ড্রিমটেক

48

সংক্ষিপ্ত উত্তর:
সরান (তালিকা থেকে results)

results.RemoveAll(r => r.ID == 2);সঙ্গে আইটেমটি মুছে ফেলা হবে আইডি 2 মধ্যে results(জায়গায়)।

ফিল্টার (মূল তালিকা থেকে অপসারণ ছাড়াই results):

var filtered = result.Where(f => f.ID != 2);আইডি 2 ব্যতীত সমস্ত আইটেম প্রদান করে

বিস্তারিত উত্তর:

আমি মনে করি .RemoveAll()খুব নমনীয়, কারণ আপনার আইটেম আইডির একটি তালিকা থাকতে পারে যা আপনি মুছে ফেলতে চান - দয়া করে নীচের উদাহরণটি বিবেচনা করুন।

যদি তোমার থাকে:

class myClass {
    public int ID; public string FirstName; public string LastName;
}

এবং resultsনিম্নলিখিত হিসাবে কিছু মান নির্ধারিত :

var results=new List<myClass> {
    new myClass()  { ID=1, FirstName="Bill", LastName="Smith" },
    new myClass()  { ID=2, FirstName="John", LastName="Wilson" },
    new myClass()  { ID=3, FirstName="Doug", LastName="Berg" },
    new myClass()  { ID=4, FirstName="Bill", LastName="Wilson" },
};

তারপরে আপনি মুছে ফেলার জন্য আইডিগুলির একটি তালিকা নির্ধারণ করতে পারেন:

var removeList = new List<int>() { 2, 3 };

এবং এগুলি সরাতে কেবল এটি ব্যবহার করুন:

results.RemoveAll(r => removeList.Any(a => a==r.ID));

এটি 2 এবং 3 আইটেমগুলি সরিয়ে ফেলবে এবং আইটেম 1 এবং 4 রাখবে - হিসাবে উল্লেখ করা হয়েছে removeListমনে রাখবেন যে এটি ঘটে যায়, তাই কোনও অতিরিক্ত অ্যাসিগমেন্টের প্রয়োজন নেই।

অবশ্যই আপনি এটি একক আইটেমগুলিতেও ব্যবহার করতে পারেন:

results.RemoveAll(r => r.ID==4);

যেখানে এটি আমাদের উদাহরণে আইডি 4 সহ বিলটি সরিয়ে ফেলবে।


ডটনেটফিডাল: ডেমো চালান


45
resultList = results.Where(x=>x.Id != 2).ToList();

আমি এখানে একটি ছোট লিঙ্ক সহায়তাকারী পছন্দ করি যা এটি কার্যকর করা সহজ এবং "যেখানে নয়" শর্তগুলি পড়ার জন্য আরও সহজ করে জিজ্ঞাসা করতে পারে:

public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
    return source.Where(x=>!predicate(x));
}

//usage in above situation
resultList = results.ExceptWhere(x=>x.Id == 2).ToList();

1
অনুরূপ অন্য একটি পদ্ধতির (যা একটি প্রাকটিক ব্যবহার করে) হ'ল List.FindIndex/ List.RemoteAt(যা "মিউটেশন অপারেশন হওয়ার" সুন্দর "বা" এত সুন্দর নয় "বৈশিষ্ট্য রয়েছে) ব্যবহার করা।

সত্য, তবে তালিকার ক্রিয়াকলাপটি মিউটরিটি করছে তা বলার বিষয়ে সতর্ক থাকুন । তালিকাতে পর্দার আড়ালে একটি অ্যারে ব্যবহার করা হয় এবং এটি প্রয়োজনীয় মনে করে এটি ছোট বা বৃহত্তর ক্ষমতা সহ এটির অ্যারেটি পুনরায় তৈরি করতে পারে। সাধারণত , অপসারণ হ'ল বিদ্যমান অ্যারেগুলির একটি স্থানের স্থানান্তর।
কিথস

এই থ্রেডটি নিরাপদ নয় এবং এর সরলতার জন্য আপনি কেবল সিঙ্গেলঅরডিফল্ট ব্যবহার করতে পারেন, এটি কোনও স্ট্যাটিক পদ্ধতিতে থাকা দরকার নেই

কেউই বলেন নি যে এটি থ্রেড-নিরাপদ ছিল (এবং থ্রেডগুলি কী করছিল তার উপর নির্ভর করে কি না; প্রকৃতপক্ষে কোনও শ্রমিকের থ্রেডকে ভিন্নতর মেমোরি কনস্ট্রাক্ট দেওয়া তুলনা করা উচিত বনাম সমস্ত একসাথে সংগ্রহে কাজ করা ), এবং ওপি প্রিকারের সাথে মিলে যাওয়াগুলি বাদে সমস্ত রেকর্ড চায় , সুতরাং সিঙ্গেলঅরডিফল্ট আসলে তারা যা চায় না ঠিক তেমন ফিরিয়ে দেয় । "স্থিতিশীল পদ্ধতি" আসলে বেশিরভাগ লিনকের মতোই একটি এক্সটেনশন পদ্ধতি এবং এটি যখনই আপনি চান না তখনই কাজ করে (একটি উপাদান বা অনেকগুলি) আপনার কাজের চেয়ে সংজ্ঞা দেওয়া সহজ।
কিথস

5

আরও একটি পদ্ধতি আছে। এটি ব্যবহার করে List.FindIndexএবং List.RemoveAt

যদিও আমি সম্ভবত কীথস (কেবল সহজ Where/ সরল ToList) উপস্থাপিত সমাধানটি ব্যবহার করব এটি এই পদ্ধতির মধ্যে পৃথক যে এটি মূল তালিকার অবজেক্টটিকে রূপান্তরিত করে। এটি প্রত্যাশার উপর নির্ভর করে একটি ভাল (বা খারাপ) "বৈশিষ্ট্য" হতে পারে।

যে কোনও ক্ষেত্রে, FindIndex( কোনও প্রহরীের সাথে মিলিত) RemoveAtআইডিগুলিতে ফাঁক থাকলে বা ক্রমটি ভুল হওয়া ইত্যাদি যদি সঠিক হয় তা নিশ্চিত করে এবং RemoveAt(বনাম Remove) ব্যবহার করে তালিকার মাধ্যমে দ্বিতীয় ও (এন) অনুসন্ধান এড়ানো যায় ।

এখানে একটি লিনকিপ্যাড স্নিপেট রয়েছে:

var list = new List<int> { 1, 3, 2 };
var index = list.FindIndex(i => i == 2); // like Where/Single
if (index >= 0) {   // ensure item found
    list.RemoveAt(index);
}
list.Dump();        // results -> 1, 3

শুভ কোডিং।


4

আপনি কী ধরণের তালিকা নির্দিষ্ট করেন না, তবে জেনেরিক তালিকাটি RemoveAt(index)পদ্ধতি বা পদ্ধতিটি ব্যবহার করতে পারে Remove(obj):

// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);

// RemoveAt(index)
resultList.RemoveAt(1);


0

... অথবা ঠিক resultlist.RemoveAt(1)যদি আপনি সূচকটি ঠিক জানেন।


0
{
    class Program
    {
        public static List<Product> list;
        static void Main(string[] args)
        {

            list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
                 new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
                 new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
                 new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
                 new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};


            Console.WriteLine("Enter ProductID to remove");
            int uno = Convert.ToInt32(Console.ReadLine());
            var itemToRemove = list.Find(r => r.ProductId == uno);
            if (itemToRemove != null)
                list.Remove(itemToRemove);
            Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
            Console.WriteLine("------------sucessfully Removed---------------");

            var query2 = from x in list select x;
            foreach (var item in query2)
            {
                /*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
                Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
            }

        }

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