একটি নির্দিষ্ট সম্পত্তির উপর লিনকুইয়ের বিচ্ছিন্নতা ()


1094

আমি এটি সম্পর্কে জানতে লিনকুইয়ের সাথে খেলছি, তবে Distinctযখন আমার কাছে সাধারণ তালিকা নেই তখন কীভাবে ব্যবহার করতে হয় তা আমি বুঝতে পারি না (একটি পূর্ণসংখ্যার একটি সাধারণ তালিকা করা বেশ সহজ, এটি প্রশ্ন নয়)। আমি কী যদি অবজেক্টের এক বা একাধিক বৈশিষ্ট্যের উপর কোনও অবজেক্টের তালিকায় ডিস্টিন্ট ব্যবহার করতে চাই ?

উদাহরণ: কোনও বস্তু যদি Personসম্পত্তি সহ থাকে Id। কীভাবে আমি সমস্ত ব্যক্তি পেতে পারি এবং Distinctতাদের ব্যবহার করে Idবস্তুর সম্পত্তির সাথে ব্যবহার করতে পারি ?

Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

আমি শুধু পেতে পারেন Person1এবং Person3? এটা কি সম্ভব?

যদি লিনকিউ দিয়ে এটি সম্ভব না Personহয়, .NET 3.5 এ এর ​​কয়েকটি বৈশিষ্ট্যের উপর নির্ভর করে একটি তালিকা রাখার সর্বোত্তম উপায় কী হবে ?

উত্তর:


1242

সম্পাদনা : এটি এখন মোরলিংকের একটি অংশ ।

আপনার যা প্রয়োজন তা কার্যকরভাবে "স্বতন্ত্র" is আমি এটি লিনকিউ এর অংশ হিসাবে বিশ্বাস করি না, যদিও এটি লেখা মোটামুটি সহজ:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

সুতরাং কেবলমাত্র Idসম্পত্তিটি ব্যবহার করে স্বতন্ত্র মানগুলি খুঁজে পেতে আপনি এটি ব্যবহার করতে পারেন:

var query = people.DistinctBy(p => p.Id);

এবং একাধিক বৈশিষ্ট্য ব্যবহার করতে, আপনি বেনামে প্রকারগুলি ব্যবহার করতে পারেন, যা সমতা যথাযথভাবে প্রয়োগ করে:

var query = people.DistinctBy(p => new { p.Id, p.Name });

স্বীকৃত, তবে এটি কাজ করা উচিত (এবং এটি এখন কমপক্ষে সংকলন করে)।

এটি কীগুলির জন্য ডিফল্ট তুলনামূলক হিসাবে ধরে নিচ্ছে - আপনি যদি সমতা তুলনামূলকভাবে পাস করতে চান তবে কেবল এটি HashSetকনস্ট্রাক্টরকে দিন।



1
@ অ্যাশেজ৯৯৯: আপনার অর্থ কী তা আমি নিশ্চিত নই। কোডটি উত্তরে এবং লাইব্রেরিতে উপস্থিত রয়েছে - আপনি নির্ভরতা নিতে খুশি কিনা তার উপর নির্ভর করে।
জন স্কিটি

10
@ অ্যাশেজ৯৯৯: আপনি যদি কেবল কোনও এক জায়গায় এটি করছেন, তবে অবশ্যই, ব্যবহার GroupByকরা সহজ। যদি আপনার একাধিক জায়গায় এটির প্রয়োজন হয় তবে উদ্দেশ্যটি সজ্জিত করার জন্য এটি অনেকগুলি ক্লিনার (আইএমও)।
জন স্কিটে

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

7
প্রকল্পটি গিথুব
Phet01

1857

যদি আমি এক বা একাধিক সংখ্যার উপর ভিত্তি করে একটি স্বতন্ত্র তালিকা পেতে চাই ?

সরল! আপনি তাদের গ্রুপ করতে চান এবং গ্রুপ থেকে কোনও বিজয়ী বেছে নিতে পারেন।

List<Person> distinctPeople = allPeople
  .GroupBy(p => p.PersonId)
  .Select(g => g.First())
  .ToList();

আপনি যদি একাধিক বৈশিষ্ট্যের উপর গোষ্ঠীগুলি সংজ্ঞায়িত করতে চান তবে এখানে কীভাবে:

List<Person> distinctPeople = allPeople
  .GroupBy(p => new {p.PersonId, p.FavoriteColor} )
  .Select(g => g.First())
  .ToList();

1
@ ErenErsonmez নিশ্চিত আমার পোস্ট কোড সহ, যদি মুলতুবি কার্যকর কার্যকর হয় তবে টোলিস্ট কলটি ছেড়ে দিন।
অ্যামি বি

5
খুব সুন্দর উত্তর! রিয়েলেল্লি স্কিল ভিউ থেকে চালিত লিনক-টু-সত্তাগুলিতে আমাকে সহায়তা করেছিল যেখানে আমি দর্শন পরিবর্তন করতে পারি না। আমার ফার্স্ট () এর চেয়ে ফার্স্টআরডিফল্ট () ব্যবহার করা দরকার - সব কিছু ভাল।
অ্যালেক্স কীস্মিত

8
আমি এটি চেষ্টা করেছি এবং এটি সিলেক্ট করতে হবে (g => g.FirstOrDefault ())

26
@ ChocapicSz Nope। উভয় Single()এবং SingleOrDefault()প্রতিটি নিক্ষেপ যখন উত্স একাধিক আইটেম থাকে। এই ক্রিয়াকলাপে, আমরা সম্ভাবনাটি আশা করি যে প্রতিটি গ্রুপের একের পর এক আইটেম থাকতে পারে। এই বিষয়টির জন্য, First()অগ্রাধিকার দেওয়া হয় FirstOrDefault()কারণ প্রতিটি গ্রুপের অবশ্যই কমপক্ষে একজন সদস্য থাকা উচিত .... যদি না আপনি এনটিটি ফ্রেমওয়ার্ক ব্যবহার করেন যা প্রতিটি গ্রুপের কমপক্ষে একজন সদস্য রয়েছে এবং তা দাবি করতে পারে না FirstOrDefault()
অ্যামি বি

2
EF FirstOrDefault() কোরটিতে বর্তমানে সমর্থিত নয় বলে মনে হচ্ছে, এমনকি github.com/dotnet/efcore/issues/12088 ব্যবহার করে আমি ৩.১-তে আছি এবং আমি "অনুবাদ করতে অক্ষম" ত্রুটি পেয়েছি।
কলিন এম ব্যারেট

78

ব্যবহার করুন:

List<Person> pList = new List<Person>();
/* Fill list */

var result = pList.Where(p => p.Name != null).GroupBy(p => p.Id).Select(grp => grp.FirstOrDefault());

whereআপনি এন্ট্রি ফিল্টার করতে সাহায্য করে (আরো জটিল হতে পারে) এবং groupbyএবং selectস্বতন্ত্র ফাংশন সঞ্চালন।


1
নিখুঁত, এবং লিনক বাড়াতে বা অন্য নির্ভরতা ব্যবহার না করে কাজ করে।
ডেভিডশেয়ার

77

আপনি যদি সমস্ত লিনকিউ-এর মতো দেখতে চান তবে আপনি কোয়েরি বাক্য গঠনটিও ব্যবহার করতে পারেন:

var uniquePeople = from p in people
                   group p by new {p.ID} //or group by new {p.ID, p.Name, p.Whatever}
                   into mygroup
                   select mygroup.FirstOrDefault();

4
হুম আমার চিন্তাগুলি কোয়েরি সিনট্যাক্স এবং অনর্গল এপিআই সিন্ট্যাক্স উভয়ই একে অপরের মতো লিনকিউ এবং লোকেরা যেগুলি ব্যবহার করে তার ঠিক পছন্দ। আমি নিজেই সাবলীল এপিআই পছন্দ করি তাই আমি সেই আরও লিঙ্ক-লাইক বিবেচনা করব তবে তারপরে অনুমান করি যে বিষয়গত
ম্যাক্স ক্যারল

লিনকিউ-লাইকের পছন্দের সাথে কোনও সম্পর্ক নেই, "লিনকিউ-লাইক" হওয়ার সাথে সি # তে এম্বেড হওয়া আলাদা কোয়েরি ভাষার মতো দেখার দরকার, আমি জাভা প্রবাহগুলি থেকে আগত সাবলীল ইন্টারফেসটিকে পছন্দ করি তবে এটি লিনকিউ-লাইক নয়।
রায়ান দি লিচ 4

চমৎকার !! আপনি আমার নায়ক!
ফারজিন কানজি

63

আমি মনে করি এটি যথেষ্ট:

list.Select(s => s.MyField).Distinct();

43
তার যদি কেবলমাত্র সেই নির্দিষ্ট ক্ষেত্রটি নয়, তবে তার পূর্ণ বস্তুর পিছনে প্রয়োজন হয়?
ফেস্টিম কাহানী

1
একই সম্পত্তি মূল্য আছে এমন বেশ কয়েকটি অবজেক্টের ঠিক কী জিনিস?
ডোনরুমাতা

40

আপনার ক্ষেত্রগুলি দ্বারা প্রথম গোষ্ঠীটি সমাধান করুন এবং তারপরে ফার্স্টর্ডফল্ট আইটেমটি নির্বাচন করুন।

    List<Person> distinctPeople = allPeople
   .GroupBy(p => p.PersonId)
   .Select(g => g.FirstOrDefault())
   .ToList();

26

আপনি মান সহ এটি করতে পারেন Linq.ToLookup()। এটি প্রতিটি অনন্য কী এর জন্য মানগুলির সংগ্রহ তৈরি করবে। সংগ্রহে প্রথম আইটেমটি নির্বাচন করুন

Persons.ToLookup(p => p.Id).Select(coll => coll.First());

17

নিম্নলিখিত কোডটি কার্যত জোন স্কিটের উত্তরের সমতুল্য ।

.NET 4.5 এ পরীক্ষা করা হয়েছে, লিংকের আগের কোনও সংস্করণে কাজ করা উচিত।

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
  this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
  HashSet<TKey> seenKeys = new HashSet<TKey>();
  return source.Where(element => seenKeys.Add(keySelector(element)));
}

গোপনে গুগল কোডে জোন স্কিটের সর্বশেষ সংস্করণ ডিস্টিন্টবাই.সি.এস পরীক্ষা করে দেখুন ।


3
এটি আমাকে একটি "ক্রমটির কোনও মান ত্রুটি নেই" দিয়েছে, তবে স্কিটির উত্তরটি সঠিক ফলাফল দিয়েছে।
কী দুর্দান্ত হবে

10

আমি একটি নিবন্ধ লিখেছি যাতে বিশদ ফাংশন কীভাবে প্রসারিত করা যায় তা বোঝানো হয় যাতে আপনি নীচের মতো করতে পারেন:

var people = new List<Person>();

people.Add(new Person(1, "a", "b"));
people.Add(new Person(2, "c", "d"));
people.Add(new Person(1, "a", "b"));

foreach (var person in people.Distinct(p => p.ID))
    // Do stuff with unique list here.

এখানে নিবন্ধটি রয়েছে: লাইনকো সম্প্রসারিত করা - আলাদা কার্যের মধ্যে একটি সম্পত্তি নির্দিষ্ট করা


3
আপনার নিবন্ধটিতে একটি ত্রুটি রয়েছে, আলাদা হওয়ার পরে একটি <T> হওয়া উচিত: পাবলিক স্ট্যাটিক আইয়ুনামেবল <টি> স্বতন্ত্র (এটি ... এছাড়াও এটি দেখে মনে হচ্ছে না যে এটি আরও একটি সম্পত্তি হিসাবে কাজ করবে (সুন্দরভাবে) যেমন প্রথমটির সংমিশ্রণ এবং শেষ নামগুলি
قطار 1

2
+1, একটি ছোটখাটো ত্রুটি ডাউনভোটের পক্ষে পর্যাপ্ত কারণ নয়, যা এতটাই নির্বোধ, প্রায়শই একটি টাইপো কল করে। এবং আমি এখনও এমন একটি জেনেরিক ফাংশন দেখতে পাচ্ছি না যা কোনও সংখ্যক সম্পত্তির জন্য কাজ করবে! আমি আশা করি ডাউনটাওয়্যারটিও এই থ্রেডে অন্য প্রতিটি উত্তরকে কমিয়ে দিয়েছে। তবে আরে এই দ্বিতীয় ধরণের কী হচ্ছে অবজেক্ট ?? আমি আপত্তি !
নওফাল

4
আপনার লিঙ্কটি নষ্ট হয়েছে
টম লিন্ট

7

ব্যক্তিগতভাবে আমি নিম্নলিখিত ক্লাসটি ব্যবহার করি:

public class LambdaEqualityComparer<TSource, TDest> : 
    IEqualityComparer<TSource>
{
    private Func<TSource, TDest> _selector;

    public LambdaEqualityComparer(Func<TSource, TDest> selector)
    {
        _selector = selector;
    }

    public bool Equals(TSource obj, TSource other)
    {
        return _selector(obj).Equals(_selector(other));
    }

    public int GetHashCode(TSource obj)
    {
        return _selector(obj).GetHashCode();
    }
}

তারপরে, একটি এক্সটেনশন পদ্ধতি:

public static IEnumerable<TSource> Distinct<TSource, TCompare>(
    this IEnumerable<TSource> source, Func<TSource, TCompare> selector)
{
    return source.Distinct(new LambdaEqualityComparer<TSource, TCompare>(selector));
}

অবশেষে, উদ্দেশ্যে ব্যবহার:

var dates = new List<DateTime>() { /* ... */ }
var distinctYears = dates.Distinct(date => date.Year);

এই পদ্ধতির সাহায্যে আমি যে সুবিধাটি পেয়েছি তা হ'ল LambdaEqualityComparerগ্রহণযোগ্য পদ্ধতিগুলির জন্য শ্রেণীর পুনরায় ব্যবহার IEqualityComparer। (ওহ, এবং আমি yieldস্টাফটি মূল লিনকিউ প্রয়োগের দিকে রেখে দিই ...)


5

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

আপনি এটি এভাবে ব্যবহার করেন:

using PowerfulExtensions.Linq;
...
var distinct = myArray.Distinct(x => x.A, x => x.B);

5

আমাদের প্রকল্পে যখন আমরা এই জাতীয় কোনও কাজের মুখোমুখি হয়েছিলাম তখন আমরা তুলনামূলক রচনার জন্য একটি ছোট এপিআই সংজ্ঞায়িত করেছি।

সুতরাং, ব্যবহারের ক্ষেত্রে এটি ছিল:

var wordComparer = KeyEqualityComparer.Null<Word>().
    ThenBy(item => item.Text).
    ThenBy(item => item.LangID);
...
source.Select(...).Distinct(wordComparer);

এবং এপিআই নিজেই এর মতো দেখাচ্ছে:

using System;
using System.Collections;
using System.Collections.Generic;

public static class KeyEqualityComparer
{
    public static IEqualityComparer<T> Null<T>()
    {
        return null;
    }

    public static IEqualityComparer<T> EqualityComparerBy<T, K>(
        this IEnumerable<T> source,
        Func<T, K> keyFunc)
    {
        return new KeyEqualityComparer<T, K>(keyFunc);
    }

    public static KeyEqualityComparer<T, K> ThenBy<T, K>(
        this IEqualityComparer<T> equalityComparer,
        Func<T, K> keyFunc)
    {
        return new KeyEqualityComparer<T, K>(keyFunc, equalityComparer);
    }
}

public struct KeyEqualityComparer<T, K>: IEqualityComparer<T>
{
    public KeyEqualityComparer(
        Func<T, K> keyFunc,
        IEqualityComparer<T> equalityComparer = null)
    {
        KeyFunc = keyFunc;
        EqualityComparer = equalityComparer;
    }

    public bool Equals(T x, T y)
    {
        return ((EqualityComparer == null) || EqualityComparer.Equals(x, y)) &&
                EqualityComparer<K>.Default.Equals(KeyFunc(x), KeyFunc(y));
    }

    public int GetHashCode(T obj)
    {
        var hash = EqualityComparer<K>.Default.GetHashCode(KeyFunc(obj));

        if (EqualityComparer != null)
        {
            var hash2 = EqualityComparer.GetHashCode(obj);

            hash ^= (hash2 << 5) + hash2;
        }

        return hash;
    }

    public readonly Func<T, K> KeyFunc;
    public readonly IEqualityComparer<T> EqualityComparer;
}

আরও বিশদ আমাদের সাইটে রয়েছে: লিনকুইতে আইক্যুলিটি কম্পিউটার


5

আপনি কোনও বস্তুর সম্পত্তি দ্বারা পৃথক রেকর্ড পাওয়ার জন্য ডাস্টিনেক্টবি () ব্যবহার করতে পারেন। এটি ব্যবহারের আগে নিম্নলিখিত বিবৃতিটি কেবল যুক্ত করুন:

মাইক্রোসফ্ট.আজাক্স. ইউটিলিটিস ব্যবহার করে;

এবং তারপরে এটি নীচের মত ব্যবহার করুন:

var listToReturn = responseList.DistinctBy(x => x.Index).ToList();

যেখানে 'সূচক' এমন এক সম্পত্তি যা আমি চাই যাতে ডেটা আলাদা হয়।


4

আপনি এটি (বজ্রপাতি দ্রুত না হলেও) এটি করতে পারেন:

people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));

অর্থাৎ, "সমস্ত আইডি নির্বাচন করুন যেখানে একই আইডির সাথে তালিকায় অন্য কোনও পৃথক ব্যক্তি নেই" "

আপনার মনে রাখবেন, উদাহরণস্বরূপ, এটি কেবলমাত্র 3 জনকে নির্বাচন করবে I'm আমি নিশ্চিত নই যে আপনি পূর্ববর্তী দুটিগুলির মধ্যে যা চান তা কীভাবে বলতে হবে।


4

আপনি যদি কেবলমাত্র DistinctByকার্যকারিতাটি পেতে আপনার প্রকল্পে মোরএলিংক লাইব্রেরিটি যুক্ত করতে না চান তবে আপনি লিনকের পদ্ধতির ওভারলোডকে যুক্তি হিসাবে Distinctগ্রহণ করে একই পরিণতি পেতে পারেন IEqualityComparer

আপনি একটি জেনেরিক কাস্টম সমতা তুলনামূলক শ্রেণি তৈরির মাধ্যমে শুরু করেন যা জেনেরিক শ্রেণির দুটি উদাহরণের কাস্টম তুলনা করতে ল্যাম্বদা সিনট্যাক্স ব্যবহার করে:

public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
    Func<T, T, bool> _comparison;
    Func<T, int> _hashCodeFactory;

    public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
    {
        _comparison = comparison;
        _hashCodeFactory = hashCodeFactory;
    }

    public bool Equals(T x, T y)
    {
        return _comparison(x, y);
    }

    public int GetHashCode(T obj)
    {
        return _hashCodeFactory(obj);
    }
}

তারপরে আপনার মূল কোডটিতে আপনি এটি এর মতো ব্যবহার করুন:

Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);

Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();

var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));

ভাল খবর! :)

উপরোক্ত নিম্নলিখিতগুলি ধরে নিয়েছেন:

  • সম্পত্তি Person.Idটাইপ হয়int
  • peopleসংগ্রহে কোন নাল উপাদান ধারণ করে না

যদি সংগ্রহটিতে নালগুলি থাকতে পারে তবে নালীর জন্য যাচাই করার জন্য কেবল ল্যাম্বডাস আবার লিখুন, উদাহরণস্বরূপ:

Func<Person, Person, bool> areEqual = (p1, p2) => 
{
    return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};

সম্পাদনা

এই পদ্ধতির ভ্লাদিমির নেস্টেরভস্কির উত্তরের মতই তবে সহজ।

এটি জোয়েলের উত্তরের মত একই তবে এটি একাধিক বৈশিষ্ট্যযুক্ত জটিল তুলনা যুক্তিকে মঞ্জুরি দেয়।

যাইহোক, যদি আপনার বস্তু শুধুমাত্র কখনও দ্বারা পৃথক হতে পারে Idতারপর অন্য ব্যবহারকারী সঠিক উত্তরটি ডিফল্ট বাস্তবায়নের ওভাররাইড যে সব আপনাকে যা করতে হবে দিলেন GetHashCode()এবং Equals()আপনার Personবর্গ এবং তারপর শুধু-এর-বক্স ব্যবহার Distinct()ফিল্টার Linq পদ্ধতি কোন নকল আউট।


আমি স্বৈরশাসনে একমাত্র অনন্য আইটেম পেতে চাই, আপনি কি দয়া করে সহায়তা করতে পারেন, আমি এই কোডটি ব্যবহার করছি যদি টেম্পিডটি ইসটেন কিছুই না তবে m_ConcurrentScriptD शब्दकोয় = টেম্পটিটি.এএসইউনামারেবল.ToD शब्दकोয় (ফাংশন (এক্স) x.স্যাফফিল্ড) fldClusterId, NULL_ID_VALUE), ফাংশন (y) y.SafeField (fldParamValue11, NULL_ID_VALUE))
আরএসবি

2

এটি করার সর্বোত্তম উপায় যা অন্যান্য .NET সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ হবে এটি হ্যান্ডেল করার জন্য সমান ও গেটহ্যাশকে ওভাররাইড করা (স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন এই কোডটি স্বতন্ত্র মানগুলি প্রত্যাখ্যান করে However তবে, আমি যা চাই তার বিপরীতে একটি দৃ strongly়ভাবে টাইপযুক্ত সংগ্রহ ফিরে দেওয়া) একটি বেনামি প্রকার ), তবে আপনার যদি আপনার কোড জুড়ে জেনেরিক কিছু প্রয়োজন হয় তবে এই নিবন্ধের সমাধানগুলি দুর্দান্ত।


1
List<Person>lst=new List<Person>
        var result1 = lst.OrderByDescending(a => a.ID).Select(a =>new Player {ID=a.ID,Name=a.Name} ).Distinct();

আপনি কি Select() new Personপরিবর্তে বোঝাতে চেয়েছিলেন new Player? আপনি যে আদেশ দিয়ে IDযাচ্ছেন তা কোনওভাবেই Distinct()সেই সম্পত্তিটি স্বতন্ত্রতা নির্ধারণে ব্যবহার করার জন্য অবহিত করে না , যদিও এটি কাজ করবে না।
বেকন

1

সমান (বস্তু আপত্তি) এবং গেটহ্যাশকোড () পদ্ধতিগুলি ওভাররাইড করুন :

class Person
{
    public int Id { get; set; }
    public int Name { get; set; }

    public override bool Equals(object obj)
    {
        return ((Person)obj).Id == Id;
        // or: 
        // var o = (Person)obj;
        // return o.Id == Id && o.Name == Name;
    }
    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

এবং তারপরে কেবল কল করুন:

List<Person> distinctList = new[] { person1, person2, person3 }.Distinct().ToList();

তবে গেটহ্যাশকোড () আরও উন্নত হওয়া উচিত (নামটিও গণনা করার জন্য), এই উত্তরটি আমার মতে সম্ভবত সেরা। প্রকৃতপক্ষে, লক্ষ্য যুক্তিকে সংরক্ষণাগারভুক্ত করার জন্য, গেটহ্যাশকোড () সমতুল্য () ওভাররাইড করার দরকার নেই, তবে আমাদের যদি পারফরম্যান্সের প্রয়োজন হয় তবে আমাদের এটিকে ওভাররাইড করতে হবে। সমস্ত তুলনা অ্যালগ, প্রথম চেক হ্যাশ, এবং সেগুলি সমান হলে সমান () কল করুন।
ওলেগ স্ক্রিপনিয়াক

এছাড়াও, সেখানে সমান () এ প্রথম লাইনটি "যদি (! (অবজেক্ট ব্যক্তি হয়)) প্রত্যাবর্তন করা উচিত"। তবে সর্বোত্তম অনুশীলন হ'ল পৃথক অবজেক্টকে কোনও প্রকারের জন্য কাস্ট করা, যেমন "var o = person as person হিসাবে; যদি (o == নাল) মিথ্যা ফিরে আসে;" তারপরে
ingালাই

1
এর মতো সমান পরিমাণে ওভাররাইড করা ভাল ধারণা নয় কারণ এটি অন্যান্য প্রোগ্রামারদের অনিচ্ছাকৃত পরিণতি হতে পারে যা একক সম্পত্তির চেয়ে বেশি ব্যক্তির সমতা নির্ধারণের আশা করে।
বি

0

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


-5

নীচের কোড দিয়ে চেষ্টা করুন।

var Item = GetAll().GroupBy(x => x .Id).ToList();

3
একটি সংক্ষিপ্ত উত্তর স্বাগত, তবে এটি পরবর্তী ব্যবহারকারীরা সমস্যার পিছনে কী ঘটছে তা বোঝার চেষ্টা করছেন তাদের খুব বেশি মূল্য প্রদান করবে না। সমস্যার কারণ হিসাবে আসল সমস্যাটি কী এবং কীভাবে সমাধান করা যায় তা বোঝাতে দয়া করে কিছুটা সময় দিন। আপনাকে ধন্যবাদ ~
হেরেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.