তালিকাতে ইতিমধ্যে বস্তু বিদ্যমান কিনা তা পরীক্ষা করে দেখুন to


102

আমার একটা তালিকা আছে

  List<MyObject> myList

এবং আমি একটি তালিকায় আইটেম যুক্ত করছি এবং আমি তা পরীক্ষা করতে চাই যে ইতিমধ্যে সেই তালিকাটি তালিকায় রয়েছে কিনা।

সুতরাং আমি এটি করার আগে:

 myList.Add(nextObject);

আমি দেখতে চাই নেক্সটঅবজেক্টটি ইতিমধ্যে তালিকায় রয়েছে কিনা।

"মাইবজেক্ট" অবজেক্টটিতে বেশ কয়েকটি বৈশিষ্ট্য রয়েছে তবে তুলনা দুটি বৈশিষ্ট্যের সাথে মিলের ভিত্তিতে।

"মাইবজেক্ট" এর এই তালিকায় আমি একটি নতুন "মাইবজেক্ট" যুক্ত করার আগে চেক করার সর্বোত্তম উপায় কী।

আমার মনে হয়েছিল কেবলমাত্র সমাধানটি ছিল একটি তালিকা থেকে একটি অভিধানে পরিবর্তন এবং তারপরে কীটি বৈশিষ্ট্যগুলির একটি কাঠের স্ট্রিং তৈরি করা (এটি কিছুটা অস্বস্তিকর বলে মনে হয়)।

তালিকা বা লিনকিউ বা অন্য কিছু ব্যবহার করে অন্য কোনও ক্লিনার সমাধান?

উত্তর:


153

এটি নির্দিষ্ট পরিস্থিতির প্রয়োজনের উপর নির্ভর করে। উদাহরণস্বরূপ, অভিধানের পদ্ধতিটি ধরে নেওয়া বেশ ভাল হবে:

  1. তালিকাটি তুলনামূলকভাবে স্থিতিশীল (প্রচুর সন্নিবেশ / মোছা নয়, যার জন্য অভিধানগুলি অপ্টিমাইজড নয়)
  2. তালিকাটি বেশ বড় (অন্যথায় অভিধানের ওভারহেড অর্থহীন)।

উপরেরগুলি যদি আপনার পরিস্থিতির জন্য সত্য না হয় তবে কেবল এই পদ্ধতিটি ব্যবহার করুন Any():

Item wonderIfItsPresent = ...
bool containsItem = myList.Any(item => item.UniqueProperty == wonderIfItsPresent.UniqueProperty);

এটি তালিকার মধ্য দিয়ে গণনা করবে যতক্ষণ না এটি কোনও মিল খুঁজে পায় বা শেষ পর্যন্ত পৌঁছায়।


তালিকার জন্য একটি প্রিডিট ডেলিগেটের ব্যবহার exএক্সিস্টদের নীচে দেখুন আরও একটি সমাধান, তবে আপনার যদি একটি অভিধানের সাথে বিশাল তালিকা এবং মূল মান থাকে তবে এটি হ্যাশ টেবিল হওয়ায় আরও দ্রুত হবে! উপভোগ করুন
ডগ

1
একাধিক মান কীভাবে পরীক্ষা করবেন?
নিতিন কারালে

80

কেবল কনটেনস পদ্ধতি ব্যবহার করুন । নোট করুন যে এটি সমতা ফাংশনের উপর ভিত্তি করে কাজ করেEquals

bool alreadyExist = list.Contains(item);

5
এটি আমার পক্ষে কাজ করে নি, এটি সর্বদা বলেছিল যে এর অস্তিত্ব নেই
সি 8

4
@ সি 8 আপনি যদি বস্তুগুলির তুলনা করার চেষ্টা করছেন, আপনার অবশ্যই নিশ্চিত হতে হবে যে আইকুয়েটেবল <T> qu আপনার উপাদানটির ধরণের জন্য সমাপ্তির প্রয়োগ কার্যকরভাবে কার্যকর করা হয়েছে। অন্যথায়, আপনি অবজেক্টের সামগ্রীর তুলনা করবেন না। কীভাবে এটি প্রয়োগ করা যায় তার উদাহরণের জন্য আহমদ নির্দেশিত পাতাগুলি লিঙ্কটি দেখুন।
ডগ নুডসেন

56

যদি এটি 2 টি বৈশিষ্ট্য ব্যবহার করা যায় তবে আপনি তা করতে পারেন:

bool alreadyExists = myList.Any(x=> x.Foo=="ooo" && x.Bar == "bat");

7

আপনি কি নিশ্চিত যে এই ক্ষেত্রে আপনার একটি তালিকা প্রয়োজন? আপনি যদি অনেকগুলি আইটেম দিয়ে তালিকাটি পপুলিং করে থাকেন তবে পারফরম্যান্স ক্ষতিগ্রস্থ হবে myList.Containsবা এর সাথে myList.Any; রান-টাইমটি চতুর্ভুজ হবে। আপনি আরও ভাল ডেটা স্ট্রাকচার ব্যবহার করে বিবেচনা করতে চাইতে পারেন। উদাহরণ স্বরূপ,

 public class MyClass
    {
        public string Property1 { get; set; }
        public string Property2 { get; set; }

    }

    public class MyClassComparer : EqualityComparer<MyClass>
    {
        public override bool Equals(MyClass x, MyClass y)
        {
            if(x == null || y == null)
               return x == y;

            return x.Property1 == y.Property1 && x.Property2 == y.Property2;
        }

        public override int GetHashCode(MyClass obj)
        {
            return obj == null ? 0 : (obj.Property1.GetHashCode() ^ obj.Property2.GetHashCode());
        }
    }

আপনি নিম্নলিখিত পদ্ধতিতে একটি হ্যাশসেট ব্যবহার করতে পারেন:

  var set = new HashSet<MyClass>(new MyClassComparer());
  foreach(var myClass in ...)
     set.Add(myClass);

অবশ্যই, যদি এর জন্য সমতার এই সংজ্ঞাটি MyClass'সর্বজনীন' হয় তবে আপনার IEqualityComparerপ্রয়োগ বাস্তবায়নের দরকার নেই ; আপনি শুধু ওভাররাইড করতে পারে GetHashCodeএবং Equalsবর্গ নিজেই।


হ্যাঁ, ভি এর জন্য বুল আমার প্রিয় ছিল। এই বিষয়টির জন্য, এটি এত দিন আগে ছিল না (প্রায় 3 সপ্তাহ) যে হ্যাশসেটটি আমার কাছে উপলব্ধ ছিল না কারণ আমি ২.০ কোডে কাজ করছিলাম, এবং আমি হ্যাশসেটের মনো বাস্তবায়নে ফেলেছি কারণ এটি এত ঘৃণ্য দরকারী :)
জন হান্না

4

আরেকটি বিষয় উল্লেখ করার দরকার হ'ল আপনার সমতা ফাংশনটি যেমনটি আপনি প্রত্যাশা করেন তা নিশ্চিত করা উচিত। আপনার বস্তুর বৈশিষ্ট্য দুটি কী সমান হিসাবে বিবেচিত হবে তার জন্য কীসের বৈশিষ্ট্যের সাথে মিল রয়েছে তা সেট আপ করতে আপনার সমান পদ্ধতিটি ওভাররাইড করা উচিত।

তারপরে আপনি কেবল mylist.contains (আইটেম) করতে পারবেন


3

আপনার সমস্যাটি কীভাবে সমাধান করবেন সে সম্পর্কে ধারণাটি চিত্রিত করার জন্য এখানে একটি দ্রুত কনসোল অ্যাপ্লিকেশন।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    public class myobj
    {
        private string a = string.Empty;
        private string b = string.Empty;

        public myobj(string a, string b)
        {
            this.a = a;
            this.b = b;
        }

        public string A
        {
            get
            {
                return a;
            }
        }

        public string B
        {
            get
            {
                return b;
            }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            List<myobj> list = new List<myobj>();
            myobj[] objects = { new myobj("a", "b"), new myobj("c", "d"), new myobj("a", "b") };


            for (int i = 0; i < objects.Length; i++)
            {
                if (!list.Exists((delegate(myobj x) { return (string.Equals(x.A, objects[i].A) && string.Equals(x.B, objects[i].B)) ? true : false; })))
                {
                    list.Add(objects[i]);
                }
            }
        }
    }
}

উপভোগ করুন!


3

সম্পাদনা: আমি প্রথম বলেছিলাম:


অভিধান সমাধান সম্পর্কে অবহেলা কি। এটি আমার কাছে পুরোপুরি মার্জিত বলে মনে হচ্ছে, esp যেহেতু আপনাকে অভিধান তৈরিতে কেবল তুলনাকারী সেট করতে হবে।


অবশ্যই যদিও এটি কোনও মান হিসাবে কী হিসাবে ব্যবহার করা অকার্যকর।

অতএব আমি একটি হ্যাশসেট ব্যবহার করব। যদি পরবর্তী ক্রিয়াকলাপগুলিকে সূচকের প্রয়োজন হয় তবে অ্যাডিংয়ের কাজ করার পরে আমি এটি থেকে একটি তালিকা তৈরি করব, অন্যথায়, কেবল হ্যাশসেটটি ব্যবহার করুন।


আমি কেবল তখনই এটি ব্যবহার করব যদি হ্যাশ টেবিলের থেকে অবজেক্টগুলির তালিকা বিশাল ছিল এবং তারা দ্রুত দেখার জন্য দুর্দান্ত।
ডগ


-1

আপনি যদি EF কোর অ্যাড ব্যবহার করেন

 .UseSerialColumn();

উদাহরণ

modelBuilder.Entity<JobItem>(entity =>
        {
            entity.ToTable("jobs");

            entity.Property(e => e.Id)
                .HasColumnName("id")
                .UseSerialColumn();
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.