.NET- এর তালিকার তালিকায় তালিকাভুক্ত সমস্ত আইটেম রয়েছে কিনা তা পরীক্ষা করার কোনও উপায় আছে?


100

আমার নিম্নলিখিত পদ্ধতি রয়েছে:

namespace ListHelper
{
    public class ListHelper<T>
    {
        public static bool ContainsAllItems(List<T> a, List<T> b)
        {
            return b.TrueForAll(delegate(T t)
            {
                return a.Contains(t);
            });
        }
    }
}

যার তালিকায় একটি তালিকায় অন্য তালিকার সমস্ত উপাদান রয়েছে কিনা তা নির্ধারণ করা হয়। এটি আমার কাছে উপস্থিত হবে যে ইতিমধ্যে নেট নেট তৈরি করা হবে that

সম্পাদনা করুন: আমি এই কোডটি মনো এর ২.৪.২ সংস্করণে ব্যবহার করছি না বলে আমার ক্ষমাপ্রার্থী।



আপনার অ্যালগরিদম হল চতুর ও (এনএম)। তালিকাগুলি বাছাই করা থাকলে, ওয়ান (এন + এম) সময়ে অন্যের উপসেট কিনা তা পরীক্ষা করা সম্ভব।
— কর্নেল

উত্তর:


178

যদি আপনি .NET 3.5 ব্যবহার করেন তবে এটি সহজ:

public class ListHelper<T>
{
    public static bool ContainsAllItems(List<T> a, List<T> b)
    {
        return !b.Except(a).Any();
    }
}

এটি এমন কোনও উপাদান রয়েছে bযা না রয়েছে কিনা তা যাচাই করে a- এবং তারপরে ফলাফলটি উল্টে দেয়।

নোট করুন যে পদ্ধতিটি ক্লাসের পরিবর্তে জেনেরিক করা কিছুটা বেশি প্রচলিত হবে এবং এর List<T>পরিবর্তে প্রয়োজনের কোনও কারণ নেই IEnumerable<T>- তাই সম্ভবত এটি অগ্রাধিকার দেওয়া হবে:

public static class LinqExtras // Or whatever
{
    public static bool ContainsAllItems<T>(this IEnumerable<T> a, IEnumerable<T> b)
    {
        return !b.Except(a).Any();
    }
}

4
এটি অনির্ধারিত, তবে ফিরে আসবে না খ.এক্সেসপ্ট (ক) .শক্তি (); আরও অনেক বেশি পঠনযোগ্য?
— নীল 15

7
খালি বাদ দিয়ে () কোনও বুলিয়ান দেয় না। এটি কোনও আইটেম ছাড়াই একটি অনুমিত <টি> প্রদান করে।
— পিটার স্টিফেন্স 15

4
আপনি মনোতে অবজেক্টগুলিতে লিনকিউ ব্যবহার করতে পারেন, আমি বিশ্বাস করি ... তবে আপনি যদি প্রশ্নটির সাথে প্রয়োজনীয়তাগুলি শুরু করতে চান তবে এটি সহায়ক হবে। মনোর কোন সংস্করণ আপনি ব্যবহার করছেন?
— জন স্কিটি

4
যদি তালিকাগুলি দৈর্ঘ্য n এবং m হয় তবে এই অ্যালগরিদমের সময় জটিলতা কী?
— কর্নেল

4
@ কলোনেলপ্যানিক: হেশের কোনও সংঘর্ষ নেই, ধরেই নেওয়া (হে (এন + এম))।
— জন স্কিটি


35

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

/// <summary>
/// Does a list contain all values of another list?
/// </summary>
/// <remarks>Needs .NET 3.5 or greater.  Source:  https://stackoverflow.com/a/1520664/1037948 </remarks>
/// <typeparam name="T">list value type</typeparam>
/// <param name="containingList">the larger list we're checking in</param>
/// <param name="lookupList">the list to look for in the containing list</param>
/// <returns>true if it has everything</returns>
public static bool ContainsAll<T>(this IEnumerable<T> containingList, IEnumerable<T> lookupList) {
    return ! lookupList.Except(containingList).Any();
}

4
একইভাবে: যেকোন = সমন্বিত public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }। আমি কিছু দ্রুত পারফরম্যান্সের সাথে তুলনা করার চেষ্টা করেছি haystack.Count() - 1 >= haystack.Except(needle).Count();এবং Intersectবেশিরভাগ সময় আরও ভাল করার জন্য বলে মনে হয়েছিল।
— ড্রজাউস

4
Any()Count() > 0public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
— শীশ

0

আপনি অন্য উপায় ব্যবহার করতে পারেন। সমানগুলি ওভাররাইড করুন এবং এটি ব্যবহার করুন

public bool ContainsAll(List<T> a,List<T> check)
{
   list l = new List<T>(check);
   foreach(T _t in a)
   {
      if(check.Contains(t))
      {
         check.Remove(t);
         if(check.Count == 0)
         {
            return true;
         }
      }
      return false;
   }
}

4
list l = new List<T>(check);আমি মনে করি না এটি সংকলন করবে এবং যদি এটি হয় তবে এটি সম্পূর্ণরূপে অপ্রয়োজনীয় হিসাবে checkইতিমধ্যে একটি তালিকা রয়েছে
— রোহিত বিপিন ম্যাথিউজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.