অন্য তালিকায় আইটেমগুলি সরান


206

আমি আইটেমগুলির অন্য তালিকা থেকে অপসারণ করতে চাই এমন আইটেমগুলির জেনেরিক তালিকাটি কীভাবে অনুসরণ করতে হবে তা বোঝার চেষ্টা করছি।

সুতরাং আসুন আমি এটি অনুমানমূলক উদাহরণ হিসাবে বলি

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

আমি একটি পূর্বাভাসের সাথে তালিকা 1 কে অতিক্রম করতে চাইছি এবং তালিকা 1 এর মধ্যে প্রতিটি আইটেম সরিয়ে ফেলতে চাই যা তালিকা 2-এ অন্তর্ভুক্ত রয়েছে।

পূর্বাভাস সূচক ভিত্তিক না হওয়ায় আমি কীভাবে এটি করব তা নিশ্চিত নই।


1
আপনি তালিকা 1-এ থাকা আইটেমগুলি সরান করতে চান যা তালিকা 2 তেও আছে?
শ্রীনিবাস রেড্ডি থাটিপার্থি

1
আপনার যদি তালিকা 1 = {foo1} এবং list2 = {foo1, foo1 have থাকে তবে কি হবে} Foo1 এর সমস্ত অনুলিপিগুলি তালিকা 2 থেকে সরিয়ে নেওয়া উচিত, বা কেবল প্রথম?
মার্ক বাইয়ার্স

2
-1 - আমি এই প্রশ্নের প্রতিটি উত্তরকে হ্রাস পেয়েছি কারণ আমি ভেবেছিলাম সেগুলি সবই ভুল ছিল, তবে এটি উপস্থিত হয় প্রশ্নটি কেবল ভয়াবহভাবে জিজ্ঞাসা করা হয়েছিল। এখন, আমি এগুলি পরিবর্তন করতে পারি না - ক্ষমা চাই। আপনার কাছ থেকে আইটেম সরাতে চান list1মধ্যে যে বিদ্যমান list2, অথবা আপনি থেকে আইটেমগুলি সরাতে চান list2মধ্যে যে বিদ্যমান list1? এই মন্তব্যের সময়, প্রদত্ত প্রতিটি উত্তর পরবর্তীটি সম্পাদন করবে।
জন রস রাশি

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

3
@ মার্ক - আপনি ঠিকই বলেছেন, আমার দোষ পুরোপুরি - এই কারণেই আমি এখানে মন্তব্যটি রেখেছি কী হয়েছিল তা ব্যাখ্যা করে, আমি আমার আগের ভোটের পরে ইতিমধ্যে আমার অনুরূপ প্রশ্নের জবাব দিয়েছিলাম এবং আমার ভোটের পরে চলে যাচ্ছিলাম মন্তব্যগুলি আমি এটির পরে খুঁজে পেয়েছি - দেখা যাচ্ছে যে এটি এর জন্য সেরা প্রক্রিয়া নয়!
জন রস রাশি

উত্তর:


358

আপনি ব্যতীত ব্যবহার করতে পারেন :

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();

আপনার সম্ভবত সেই অস্থায়ী পরিবর্তনগুলিও প্রয়োজন নেই:

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

নোট যা Exceptকোনও তালিকার সংশোধন করে না - ফলাফল সহ এটি একটি নতুন তালিকা তৈরি করে।


13
গৌণ বিন্দু, তবে এটি একটি IEnumerable<car>নয়, একটি উত্পাদন করবে List<car>ToList()একটি তালিকা ফিরে পেতে আপনার কল করতে হবে। তদতিরিক্ত, আমি বিশ্বাস করি এটি হওয়া উচিতGetSomeOtherList().Except(GetTheList()).ToList()
অ্যাডাম রবিনসন

9
আপনার using System.Linq;আগে এটি না থাকলে আপনারও প্রয়োজন হবে।
yellavon

1
দ্রষ্টব্য: list1. বাদে (list2) list2.Excep (list1) হিসাবে একই ফল দেবে না। সর্বশেষ আমার জন্য কাজ করেছে।
রেডবিএক্স

2
এটি ব্যবহার করার সময় কেবল সতর্কতা অবলম্বন করুন Exceptএটি প্রকৃতপক্ষে কোনও সেট অপারেশন করে যা ফলাফলের তালিকাকে আলাদা করে। আমি এই ব্যবহারটি প্রত্যাশা করছিলাম না কারণ আমি একটি ব্যবহার করছি List, ক না HashSetসম্পর্কিত।
লোগান 20

4
এই সঠিক উত্তর কিভাবে আসে? অবশ্যই আপনার প্রসঙ্গে আপনি যা চান তা তা আপনাকে দিতে পারে তবে অবশ্যই "অন্য তালিকার এক তালিকা থেকে আইটেমগুলি সরিয়ে ফেলুন" একটি নির্দিষ্ট পার্থক্যমূলক ক্রিয়াকলাপের সমতুল্য নয় এবং আপনি এটি সঠিক উত্তর হিসাবে স্বীকার করে লোকদের ভুল তথ্য দেবেন না !!!!
ব্যবহারকারী 1935724

37

আপনার কোনও সূচকের দরকার নেই, কারণ List<T>শ্রেণিটি আপনাকে Removeফাংশনটি ব্যবহার করে সূচকের চেয়ে মান অনুসারে আইটেমগুলি সরিয়ে ফেলতে দেয় ।

foreach(car item in list1) list2.Remove(item);

3
+1, তবে আইএমওতে আপনার list2.Remove(item);বক্তব্যটির চারপাশে বন্ধনী ব্যবহার করা উচিত ।
এভিনিস

2
@ এসআর পিটি: আমি সর্বদা অন্য লাইনে উপস্থিত স্টেটমেন্টগুলিতে বন্ধনী ব্যবহার করি, তবে একক-বিবৃতি ব্লকগুলিতে নয় যা আমি প্রবাহ নিয়ন্ত্রণ বিবৃতি হিসাবে একই লাইনে রাখতে পারি / করতে পারি।
অ্যাডাম রবিনসন

4
@ ইউরিজ: মার্জিত হবে কিছুর যোগ্যতা উপেক্ষা করা, এটিই একমাত্র উত্তর যা আসলে প্রশ্নটি যা বলে তা করে (মূল তালিকার আইটেমগুলি সরিয়ে দেয়); অন্য উত্তরটি একটি নতুন তালিকা তৈরি করে , যা তালিকাটি অন্য একজন কলারের কাছ থেকে পাস করা হচ্ছে যদি এটি প্রতিস্থাপনের তালিকার পরিবর্তে পরিবর্তিত হওয়ার প্রত্যাশা করে তবে তা পছন্দসই হবে না।
অ্যাডাম রবিনসন

5
@ ইউরিজ অ্যাডাম রবিনসন যেহেতু আমরা মার্জিত সমাধানগুলি নিয়ে আলোচনা করছি ...list1.ForEach(c => list2.Remove(c));
ডেভিড শেরেট

1
"মার্জিত" এর অর্থ হওয়া উচিত "বিকাশকারী এই কোডটি বজায় রেখে আটকে এটি সহজ এবং সহজেই বুঝতে পারবেন," এই কারণেই এটি সেরা উত্তর।
শেঠ

22

আমি লিনকিউ এক্সটেনশন পদ্ধতি ব্যবহার করার পরামর্শ দেব । আপনি কোডের এক লাইনের সাহায্যে সহজেই এটি করতে পারেন:

list2 = list2.Except(list1).ToList();

এটি অবশ্যই ধরে নেওয়া হচ্ছে আপনি তালিকা 2 থেকে অপসারণ করছে এমন তালিকা 1-এ থাকা অবজেক্টগুলি একই উদাহরণ।


2
এটি ডুপ্লিকেটগুলিও সরিয়ে দেয়।
জুলাইআরডিনারি

17

আমার ক্ষেত্রে আমার দুটি সাধারণ তালিকা ছিল, একটি সাধারণ শনাক্তকারী সহ, বিদেশী কী জাতীয় ধরণের। দ্বিতীয় সমাধান "nzrytmn" দ্বারা উদ্ধৃত :

var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

আমার পরিস্থিতির মধ্যে সবচেয়ে উপযুক্ত এটি ছিল। ইতিমধ্যে নিবন্ধীকৃত রেকর্ড ছাড়া আমার একটি ড্রপডাউনলিস্ট লোড করা দরকার।

ধন্যবাদ !!!

এটি আমার কোড:

t1 = new T1();
t2 = new T2();

List<T1> list1 = t1.getList();
List<T2> list2 = t2.getList();

ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList();
ddlT3.DataTextField = "AnyThing";
ddlT3.DataValueField = "IdAnyThing";
ddlT3.DataBind();

OD কখনই DDlT3 কী তা ব্যাখ্যা করেন নি
আগস্টে দুর্বৃত্ত 39nin

15

আপনি লিনকিউ ব্যবহার করতে পারতেন, তবে আমি RemoveAllপদ্ধতিটি নিয়ে যেতে পারি । আমি মনে করি যে এটিই আপনার উদ্দেশ্যকে আরও ভালভাবে প্রকাশ করে।

var integers = new List<int> { 1, 2, 3, 4, 5 };

var remove = new List<int> { 1, 3, 5 };

integers.RemoveAll(i => remove.Contains(i));

9
অথবা পদ্ধতি গোষ্ঠীর সাথে আপনি আরও সহজতর করতে পারেন - পূর্ণসংখ্যা। সরানআল (সরান C কনটেনস);
রায়ান 21

12
list1.RemoveAll(l => list2.Contains(l));

ওরফে "সম্পূর্ণ অশুচি" :-)
শান-কুন ক্লার্ক-ডেভিস

এতে কী ভুল হয়েছে। বাদে আরও একটি তালিকা তৈরি করার পরে এটি আরও ভাল দেখাচ্ছে। বিশেষত যখন উভয় তালিকা খুব ছোট হয়।
মাইক কেসকিনভ

1
যেহেতু উভয় তালিকা পদ্ধতি O(N), এই নেতৃত্ব হবে O(N^2)যা বৃহৎ তালিকা সঙ্গে একটি বিষয় হতে পারে।
tigrou

7

সমাধান 1: আপনি এটি করতে পারেন:

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

তবে কিছু ক্ষেত্রে এই সমাধানটি কার্যকর নাও করতে পারে। যদি এটি কাজ না করে থাকে তবে আপনি আমার দ্বিতীয় সমাধানটি ব্যবহার করতে পারেন।

সমাধান 2:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

আমরা ভান করি যে তালিকা 1 আপনার প্রধান তালিকা এবং তালিকা 2 হ'ল আপনার সেকেন্ডারি তালিকা এবং আপনি তালিকা 2 এর আইটেম ছাড়াই তালিকা 1 এর আইটেম পেতে চান।

 var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

0

হিসাবে Exceptতালিকা সংশোধন না করে, আপনি ব্যবহার করতে পারেন foreach উপর List<T>:

list2.ForEach(item => list1.Remove(item));

এটি সর্বাধিক দক্ষ উপায় নাও হতে পারে তবে এটি সহজ, অতএব পাঠযোগ্য এবং এটি মূল তালিকাটি আপডেট করে (যা আমার প্রয়োজনীয়তা)।


-3

এই যে তুমি ..

    List<string> list = new List<string>() { "1", "2", "3" };
    List<string> remove = new List<string>() { "2" };

    list.ForEach(s =>
        {
            if (remove.Contains(s))
            {
                list.Remove(s);
            }
        });

3
-1। প্রথম আইটেমটি সরানোর পরে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে। এছাড়াও, (সাধারণত) তালিকাটি সরানোর জন্য সাধারণত উত্তরণ করার জন্য এটি আরও ভাল ধারণা । আপনি আরও তালিকা ট্র্যাভারসালকে এইভাবে এটি করতে বাধ্য করছেন।
অ্যাডাম রবিনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.