। কাস্টম শ্রেণীর অবজেক্টের তালিকায় অন্তর্ভুক্ত ()


95

আমি .Contains()কাস্টম অবজেক্টের তালিকায় ফাংশনটি ব্যবহার করার চেষ্টা করছি

এই তালিকা:

List<CartProduct> CartProducts = new List<CartProduct>();

এবং CartProduct:

public class CartProduct
{
    public Int32 ID;
    public String Name;
    public Int32 Number;
    public Decimal CurrentPrice;
    /// <summary>
    /// 
    /// </summary>
    /// <param name="ID">The ID of the product</param>
    /// <param name="Name">The name of the product</param>
    /// <param name="Number">The total number of that product</param>
    /// <param name="CurrentPrice">The currentprice for the product (1 piece)</param>
    public CartProduct(Int32 ID, String Name, Int32 Number, Decimal CurrentPrice)
    {
        this.ID = ID;
        this.Name = Name;
        this.Number = Number;
        this.CurrentPrice = CurrentPrice;
    }
    public String ToString()
    {
        return Name;
    }
}

সুতরাং আমি তালিকার মধ্যে একটি অনুরূপ কার্ট প্রোডাক্ট সন্ধান করার চেষ্টা করি:

if (CartProducts.Contains(p))

তবে এটি অনুরূপ কার্টপ্রডাক্টগুলিকে উপেক্ষা করে এবং আমি কী চেক করে তা জানি না - আইডি? নাকি সব?

আগাম ধন্যবাদ! :)

উত্তর:


119

আপনার বাস্তবায়ন IEquatableবা ওভাররাইড করা প্রয়োজন Equals()এবংGetHashCode()

উদাহরণ স্বরূপ:

public class CartProduct : IEquatable<CartProduct>
{
    public Int32 ID;
    public String Name;
    public Int32 Number;
    public Decimal CurrentPrice;

    public CartProduct(Int32 ID, String Name, Int32 Number, Decimal CurrentPrice)
    {
        this.ID = ID;
        this.Name = Name;
        this.Number = Number;
        this.CurrentPrice = CurrentPrice;
    }

    public String ToString()
    {
        return Name;
    }

    public bool Equals( CartProduct other )
    {
        // Would still want to check for null etc. first.
        return this.ID == other.ID && 
               this.Name == other.Name && 
               this.Number == other.Number && 
               this.CurrentPrice == other.CurrentPrice;
    }
}

4
তবে কোথায় GetHashCode()?
zionpi

4
আপনাকে গেটহ্যাশকোড () প্রয়োগ করার দরকার নেই। এটি ছাড়া এটি কাজ করে।
ব্যবহারকারীর 890332

141

যদি আপনি .NET 3.5 বা আরও নতুন ব্যবহার করে থাকেন তবে এক্সটেনশন পদ্ধতির সাথে "অন্তর্ভুক্ত" চেক অর্জন করতে আপনি লিনকিউ এক্সটেনশন পদ্ধতিগুলি ব্যবহার করতে পারেন Any:

if(CartProducts.Any(prod => prod.ID == p.ID))

এটি এমন কোনও পণ্যের অস্তিত্বের জন্য যাচাই করবে CartProductsযেটির মধ্যে আইডির সাথে মেলে একটি আইডি p। আপনি =>চেক চালু করার পরে কোনও বুলিয়ান এক্সপ্রেশন রাখতে পারেন।

এটি লিনকিউ-এস -কিউএল কোয়েরিগুলির পাশাপাশি মেমরি মেমরির কোয়েরিতে কাজ করার সুবিধাও রয়েছে, যেখানে Containsনেই।


12

তালিকাটিতে নির্দিষ্ট বস্তুটি রয়েছে কিনা তা এটি পরীক্ষা করে।

আপনি তালিকার সন্ধান পদ্ধতিটি আরও ভাল ব্যবহার করতে পারেন।

এখানে একটি উদাহরণ

List<CartProduct> lst = new List<CartProduct>();

CartProduct objBeer;
objBeer = lst.Find(x => (x.Name == "Beer"));

আশা করি এইটি কাজ করবে

আপনার লিনকিউ-তেও নজর দেওয়া উচিত - এটির জন্য সম্ভবত ওভারকিল, তবে তবুও একটি দরকারী সরঞ্জাম ...


4
লিঙ্ক কীভাবে কীভাবে বেশি ওভারকিল করা যায়?
মেল জেরাত

@ এমইএল - কেন কোনও প্রশ্নের সাথে মিশে যান এবং এই সাধারণ কোনও কিছুর জন্য অনুক্রম টাইপ করুন? যদিও এটি বলেছিল, লামদাসের সাথে পরিচিত না এমন কারও কাছে এটি আরও পঠনযোগ্য হতে পারে ...
মার্টিন মিলান

+1 ভাল স্পষ্ট উদাহরণ, এটি সেই বিকল্পটি দেখায় যা অন্য কোথাও পরিবর্তনের দ্বারা প্রভাবিত হবে না (যেমন যদি Equals()কোনও কারণেই পদ্ধতিটি পরিবর্তিত হয়)
রোল্যান্ড শ

4

ডিফল্ট হিসাবে রেফারেন্স প্রকারের রেফারেন্স সমতা থাকে (অর্থাত্ দুটি উদাহরণ কেবল একই জিনিস হলে তারা সমান)।

আপনার নিজের সাম্যতা প্রয়োগ করতে আপনাকে ওভাররাইড করতে হবে Object.Equals(এবং Object.GetHashCodeম্যাচ করতে হবে)। (এবং এটির পরে সমতা ==, অপারেটর বাস্তবায়ন করা ভাল অনুশীলন ))


4
কেন অবজেক্ট.অকুয়ালগুলি ওভাররাইড করে, কোডে অন্য কোথাও এর পরিণতি হতে পারে? আমার কাছে এটি অনুসারে অনুসন্ধান কোডটি সংশোধন করা আরও বোধগম্য হয়, এবং বস্তুর অন্তর্নিহিত শ্রেণিটি অনুসন্ধান করা হয় না ...
মার্টিন মিলান

আপনি কি এর কয়েকটি উদাহরণ hvave রেখেছেন? ফাইন্ড () বা অবজেক্টটিকে ওভাররাইড করে .কুইকেলস / গেটহ্যাশকোড?
জান জোহানসেন

@ মার্টিন আইটিটি খুব ভেঙে যাবে যদি আপনি দুটি CartProductস্থানে ভিন্ন জায়গায় ভিন্ন আচরণ করার জন্য তুলনা করতে চান ।
রোভল্যান্ড শ

4
@ রোল্যান্ড - তবে আমি বলছি না যে তুলনা কীভাবে কাজ করে তাকে পরিবর্তন করতে হবে। যদি সে একটি নির্দিষ্ট অবজেক্ট চায় তবে কনটেনস () ব্যবহার করুন। যদি তিনি কোনও নির্দিষ্ট মানদণ্ডের সাথে মেলে এমন কোনও জিনিস চান, তবে উপযুক্ত প্রিকিকেট (লামডা এক্সপ্রেশন) দিয়ে Find () ব্যবহার করুন ... আমি আসলে তর্ক করছি যে আপনি সমস্ত তুলনা কোডটি স্পর্শ করেন না - আপনি কেবলমাত্র সঠিক পদ্ধতিটি কল করেন আপনি যে কাজটি সম্পাদন করতে চেষ্টা করছেন তার তালিকা দিন ...
মার্টিন মিলান

4
@ মার্টিন উপস্থিত হয় আমি আপনার মন্তব্য "ওভাররাইড Contains()" এর লাইনে কিছু হতে ভুল ব্যাখ্যা করেছি । একমত হোন যে Find()সমস্যার সমাধান করতে পারে, যদিও আমি প্রস্তাব দিচ্ছি যে একটি উপযুক্ত সমতুল্য পদ্ধতি থাকা অন্যান্য ক্ষেত্রে লোড করার ক্ষেত্রে আরও বেশি কার্যকর হতে পারে, কারণ ওপিতে দেখা যায়নি যে একই সত্তার দুটি উদাহরণের রেফারেন্স আলাদা ছিল।
রোভল্যান্ড শ

1

আপনাকে আপনার তালিকা থেকে একটি বিষয় তৈরি করতে হবে যেমন:

List<CartProduct> lst = new List<CartProduct>();

CartProduct obj = lst.Find(x => (x.Name == "product name"));

এই বস্তুটি তাদের বৈশিষ্ট্যগুলির দ্বারা বর্ণিত মান সন্ধান করে: x.name

তারপরে আপনি কন্টেন্টস বা রিমুভের মতো তালিকা পদ্ধতি ব্যবহার করতে পারেন

if (lst.Contains(obj))
{
   lst.Remove(obj);
}

0

বাস্তবায়ন override Equals()এবংGetHashCode()

public class CartProduct
{
    public Int32 ID;
    ...

    public CartProduct(Int32 ID, ...)
    {
        this.ID = ID;
        ...
    }

    public override int GetHashCode()
    {
        return ID;
    }

    public override bool Equals(Object obj)
        {
            if (obj == null || !(obj is CartProduct))
                return false;
            else
                return GetHashCode() == ((CartProduct)obj).GetHashCode();
        }

}

ব্যবহৃত:

if (CartProducts.Contains(p))

-1

আপনি যদি এটির নিয়ন্ত্রণ রাখতে চান তবে আপনাকে [আইকুয়েটেবল ইন্টারফেস] প্রয়োগ করতে হবে [1]

[1]: http: // এই পদ্ধতিটি আইকুইটেটেবলের আইটেমের প্রয়োগ দ্বারা সংজ্ঞায়িত হিসাবে ডিফল্ট সাম্যতা তুলক ব্যবহার করে সমতা নির্ধারণ করে T টির জন্য পদ্ধতি পদ্ধতি (তালিকার মানগুলির ধরণ)।

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