.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.