লাম্বদা দিয়ে আলাদা ()?


745

ঠিক আছে, সুতরাং আমার একটি সংখ্যা আছে এবং এ থেকে স্বতন্ত্র মান পেতে ইচ্ছুক।

ব্যবহার করে System.Linq, অবশ্যই একটি এক্সটেনশন পদ্ধতি বলা হয় Distinct। সাধারণ ক্ষেত্রে এটি কোনও পরামিতি ছাড়াই ব্যবহার করা যেতে পারে, যেমন:

var distinctValues = myStringList.Distinct();

ভাল এবং ভাল, তবে আমার কাছে যদি পরিমাণে সামঞ্জস্যতা উল্লেখ করার প্রয়োজন হয় তবে আমি কেবলমাত্র ওভারলোডটি উপলভ্য:

var distinctValues = myCustomerList.Distinct(someEqualityComparer);

সমতা তুলনামূলক যুক্তি একটি উদাহরণ হতে হবে IEqualityComparer<T>। আমি এটি অবশ্যই করতে পারি, তবে এটি কিছুটা ভার্জোজ এবং ভাল, ক্লডজি।

আমি যা প্রত্যাশা করব তা হ'ল একটি ওভারলোড যা ল্যাম্বডা নেবে, একটি ফানক <টি, টি, বুল> বলুন:

var distinctValues
    = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);

যে কেউ এরকম কিছু এক্সটেনশন উপস্থিত আছে, বা কিছু সমতুল্য কাজ আছে কিনা জানেন? নাকি আমি কিছু মিস করছি?

বিকল্পভাবে, কোনও আইকোয়ালিটি কম্পিউটারের ইনলাইন (আমাকে বিব্রত করবেন) নির্দিষ্ট করার কোনও উপায় আছে কি?

হালনাগাদ

আমি এই বিষয়ে একটি এমএসডিএন ফোরামের একটি পোস্টে অ্যান্ডারস হেজলসবার্গের একটি উত্তর পেয়েছি । তিনি বলেন:

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

আমি মনে করি এটি উপলব্ধি করে ..


2
দেখতে stackoverflow.com/questions/1183403/... একটি সমাধান GroupBy ব্যবহার করার জন্য

17
Anders Hejlsberg আপডেটের জন্য ধন্যবাদ!
টর হগেন

নাহ, এটি কোনও তাত্পর্যপূর্ণ নয় - দুটি বস্তু যা অভিন্ন মান ধারণ করে কিভাবে দুটি পৃথক হ্যাশ-কোড ফেরত দিতে পারে ??
জিওয়াই

এটি সহায়তা করতে পারে - এর জন্য সমাধান.Distinct(new KeyEqualityComparer<Customer,string>(c1 => c1.CustomerId)) , এবং ব্যাখ্যা করুন কেন গেটহ্যাশকোড () সঠিকভাবে কাজ করা গুরুত্বপূর্ণ।
মারবেল 82

সম্পর্কিত / সম্ভাব্য সদৃশ এর নকল: একটি নির্দিষ্ট সম্পত্তির উপর
লাইনকের বিভাজন

উত্তর:


1028
IEnumerable<Customer> filteredList = originalList
  .GroupBy(customer => customer.CustomerId)
  .Select(group => group.First());

12
অসাধারণ! এটি এক্সটেনশান পদ্ধতিতেও খুব সহজেই সহজ, যেমন DistinctBy(বা এমনকি Distinct, যেহেতু স্বাক্ষরটি অনন্য হবে)।
টমাস আসচান

1
আমার জন্য কাজ করে না! <পদ্ধতি 'প্রথম' কেবলমাত্র একটি চূড়ান্ত ক্যোয়ারী অপারেশন হিসাবে ব্যবহার করা যেতে পারে। পরিবর্তে এই উদাহরণে 'ফার্স্টআরডিফল্ট' পদ্ধতিটি ব্যবহার করার বিষয়টি বিবেচনা করুন> এমনকি আমি 'ফার্স্টআরডিফল্ট' চেষ্টা করেছিলাম এটি কার্যকর হয়নি।
জ্যাটসিং

63
@ টরহাগেন: কেবল সচেতন থাকুন যে এই সমস্ত গ্রুপ তৈরিতে ব্যয় জড়িত। এটি ইনপুটটি স্ট্রিম করতে পারে না এবং কিছু ফেরানোর আগে সমস্ত ডেটা বাফারিংয়ের সমাপ্ত হবে। এটি অবশ্যই আপনার পরিস্থিতির জন্য প্রাসঙ্গিক নাও হতে পারে তবে আমি ডিস্টিনটবাইয়ের কমনীয়তা পছন্দ করি :)
জন স্কিটি

2
@ জোনস্কিট: এটি কেবলমাত্র একটি বৈশিষ্ট্যের জন্য অতিরিক্ত গ্রন্থাগার আমদানি করতে চান না এমন ভিবি.এনইটি কোডারদের পক্ষে এটি যথেষ্ট ভাল। এএসআইএনসি সিটিপি ছাড়া ভিবি.এনইটি yieldবিবৃতি সমর্থন করে না তাই প্রযুক্তিগতভাবে স্ট্রিমিং সম্ভব নয়। যদিও আপনার উত্তরের জন্য ধন্যবাদ। সি # তে কোডিং করার সময় আমি এটি ব্যবহার করব। ;-)
অ্যালেক্স Essilfie

2
@ বেনগ্রিপকা: এটি মোটেও এক রকম নয়। এটি আপনাকে কেবল গ্রাহক আইডি দেয়। আমি পুরো গ্রাহককে চাই :)
রায়ানম্যান

495

আপনি মোরিলিংকিউDistinctBy থেকে চাইছেন এমনটি আমার কাছে লাগে । তারপরে আপনি লিখতে পারেন:

var distinctValues = myCustomerList.DistinctBy(c => c.CustomerId);

এখানে একটি কাটা ডাউন সংস্করণ রয়েছে DistinctBy(কোনও শালীনতা যাচাই করা নেই এবং আপনার নিজস্ব কী তুলনাকারী নির্দিষ্ট করার কোনও বিকল্প নেই):

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

14
আমি জানতাম সর্বোত্তম উত্তরটি পোস্টের শিরোনামটি পড়ে জোন স্কিটি পোস্ট করবেন। যদি এটি লিনকিউয়ের সাথে কিছু করার থাকে তবে স্কিটি আপনার লোক। -শ্বরের মতো লিংক জ্ঞান অর্জন করতে 'সি # গভীরতায়' পড়ুন।
নোকারিয়ার

2
দুর্দান্ত উত্তর !!! এছাড়াও, yieldঅতিরিক্ত ভিউ সম্পর্কে সমস্ত ভিবি_কম্পিলারদের জন্য, ভবিষ্যদ্বাণীটি আবার লিখতে পারেনreturn source.Where(element => knownKeys.Add(keySelector(element)));
ড্যানিস মোরোজভ

5
@ SudhAnsu63 এটি লিনকটোস্কুলের সীমাবদ্ধতা (এবং অন্যান্য লিঙ্ক সরবরাহকারী)। লিনকোটাক্সের অভিপ্রায়টি হল আপনার সি # ল্যাম্বডা এক্সপ্রেশনটিকে এক্সের স্থানীয় প্রসঙ্গে অনুবাদ করা That এর অর্থ সি # তে থাকা যে কোনও পদ্ধতিতে এসকিউএলে প্রকাশ করার কোনও উপায় না থাকলে (বা আপনি যে লিনক সরবরাহকারী ব্যবহার করছেন) যদি কোনও লিঙ্কপ্রোভাইডারকে "পাস" করা যায় না। আমি এটি মডেল দেখার জন্য ডেটা অবজেক্টগুলিকে রূপান্তর করতে এক্সটেনশন পদ্ধতিতে দেখছি। আপনি "ডিস্টিন্টটবাই" () এর আগে টোলিস্ট () কল করে ক্যোয়ারীর "বৈকল্পিককরণ" করে কাজ করতে পারেন।
মাইকেল ব্ল্যাকবার্ন

1
এবং যখনই আমি এই প্রশ্নটিতে ফিরে আসি আমি ভাবতে থাকি কেন তারা কমপক্ষে মোড়লিংকের কিছু ছাত্রলীগে গ্রহণ করেন না।
শিমি ওয়েটজ্যান্ডলার

2
@ শিম্মি: আমি অবশ্যই এটিকে স্বাগত জানাই ... সম্ভাব্যতা কী তা আমি নিশ্চিত নই। আমি এটি নেট ফাউন্ডেশনে যদিও উত্থাপন করতে পারি ...
জন স্কিটি

39

জিনিস আপ মোড়ানো । আমি মনে করি আমার মতো যারা এখানে এসেছেন তাদের বেশিরভাগই কোনও লাইব্রেরি ব্যবহার না করে এবং সর্বোত্তম সম্ভাব্য পারফরম্যান্স সহ সহজতম সমাধানটি চান ।

(আমার কাছে পদ্ধতি অনুসারে গৃহীত গোষ্ঠীটি আমার মনে হয় পারফরম্যান্সের দিক থেকে একটি ওভারকিল)

এখানে আইকোয়ালিটি কম্পিউটারের ইন্টারফেস ব্যবহার করে একটি সাধারণ এক্সটেনশন পদ্ধতি যা নাল মানগুলির জন্যও কাজ করে।

ব্যবহার:

var filtered = taskList.DistinctBy(t => t.TaskExternalId).ToArray();

এক্সটেনশন পদ্ধতি কোড

public static class LinqExtensions
{
    public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, Func<T, TKey> property)
    {
        GeneralPropertyComparer<T, TKey> comparer = new GeneralPropertyComparer<T,TKey>(property);
        return items.Distinct(comparer);
    }   
}
public class GeneralPropertyComparer<T,TKey> : IEqualityComparer<T>
{
    private Func<T, TKey> expr { get; set; }
    public GeneralPropertyComparer (Func<T, TKey> expr)
    {
        this.expr = expr;
    }
    public bool Equals(T left, T right)
    {
        var leftProp = expr.Invoke(left);
        var rightProp = expr.Invoke(right);
        if (leftProp == null && rightProp == null)
            return true;
        else if (leftProp == null ^ rightProp == null)
            return false;
        else
            return leftProp.Equals(rightProp);
    }
    public int GetHashCode(T obj)
    {
        var prop = expr.Invoke(obj);
        return (prop==null)? 0:prop.GetHashCode();
    }
}

19

না এর জন্য এই জাতীয় কোনও এক্সটেনশন পদ্ধতি নেই। আমি অতীতে নিজেকে হতাশ করে দেখেছি এবং যেমন এই সমস্যাটি মোকাবেলায় আমি সাধারণত একটি সহায়ক শ্রেণি লিখি। লক্ষ্যটি রূপান্তর Func<T,T,bool>করা IEqualityComparer<T,T>

উদাহরণ

public class EqualityFactory {
  private sealed class Impl<T> : IEqualityComparer<T,T> {
    private Func<T,T,bool> m_del;
    private IEqualityComparer<T> m_comp;
    public Impl(Func<T,T,bool> del) { 
      m_del = del;
      m_comp = EqualityComparer<T>.Default;
    }
    public bool Equals(T left, T right) {
      return m_del(left, right);
    } 
    public int GetHashCode(T value) {
      return m_comp.GetHashCode(value);
    }
  }
  public static IEqualityComparer<T,T> Create<T>(Func<T,T,bool> del) {
    return new Impl<T>(del);
  }
}

এটি আপনাকে নিম্নলিখিত লিখতে দেয়

var distinctValues = myCustomerList
  .Distinct(EqualityFactory.Create((c1, c2) => c1.CustomerId == c2.CustomerId));

8
এটি একটি বাজে হ্যাশ কোড বাস্তবায়ন যদিও আছে। IEqualityComparer<T>কোনও প্রোজেকশন থেকে এটি তৈরি করা আরও সহজ : স্ট্যাকওভারফ্লো.com
জন স্কিটে

7
(কেবলমাত্র হ্যাশ কোড সম্পর্কে আমার মন্তব্য ব্যাখ্যা করতে - এই কোডটির সাথে সমান (x, y) == সত্য, তবে গেটহ্যাশকোড (এক্স)! = গেটহ্যাশকোড (y) দিয়ে শেষ করা খুব সহজ That যা মূলত হ্যাশটেবলের মতো কোনও কিছু ভেঙে দেয় ।)
জন স্কিটে

আমি হ্যাশ কোড আপত্তি সহ একমত। তবুও, প্যাটার্নের জন্য +1।
টর হগেন 14 ই

@ জন, হ্যাঁ আমি সম্মত হই যে গেটহ্যাশকোডের মূল প্রয়োগটি অনুকূলের চেয়ে কম (অলস ছিল)। আমি এখন এটিকে মূলত ইক্যুয়ালিটি কম্পিউটারে <T> .ডিফল্ট.গেটহ্যাশকোড () ব্যবহার করুন যা কিছুটা বেশি স্ট্যান্ডার্ড। সত্য সত্য যদিও, এই দৃশ্যে গেটহ্যাশকোড বাস্তবায়ন কাজ করার একমাত্র গ্যারান্টিযুক্ত হ'ল কেবল একটি ধ্রুবক মান ফিরিয়ে দেওয়া। হ্যাশটেবল লুক মেরে ফেলেছে তবে কার্যকরীভাবে সঠিক হওয়ার গ্যারান্টি রয়েছে।
জারেডপাড়

1
@ জারেডপার: হুবহু হ্যাশ কোড সমতা ফাংশন আপনি ব্যবহার করছেন, যা সম্ভবতঃ সঙ্গে সামঞ্জস্যপূর্ণ হতে হয়েছে নয় ডিফল্ট এক অন্যথায় আপনাকে বিরক্ত করবে না :) কেন আমি পছন্দ একটি অভিক্ষেপ ব্যবহার করতে যে - আপনি উভয় সমতা এবং একটি যুক্তিসম্মত হ্যাশ পেতে পারেন যেভাবে কোড। এটি কলিং কোডটিরও সদৃশ কম করে তোলে। স্বীকার করা এটি কেবলমাত্র সেই ক্ষেত্রে কাজ করে যেখানে আপনি দুবার একই প্রক্ষেপণ চান, তবে এটি প্রতিটি ক্ষেত্রেই আমি
বাস্তবে

18

শর্টহ্যান্ড সমাধান

myCustomerList.GroupBy(c => c.CustomerId, (key, c) => c.FirstOrDefault());

1
এটি কেন উন্নত হয়েছে তার কিছু ব্যাখ্যা যোগ করতে পারেন?
কিথ পিনসন

এটি আসলে আমার পক্ষে খুব সুন্দরভাবে কাজ করেছিল যখন কনরাদ না করে।
নিওসক্রাইব করুন

13

এটি আপনার যা করতে চায় তা করবে তবে আমি অভিনয় সম্পর্কে জানি না:

var distinctValues =
    from cust in myCustomerList
    group cust by cust.CustomerId
    into gcust
    select gcust.First();

কমপক্ষে এটি ভার্জোজ নয়।


12

এখানে একটি সাধারণ এক্সটেনশন পদ্ধতি যা আমার যা প্রয়োজন তা করে ...

public static class EnumerableExtensions
{
    public static IEnumerable<TKey> Distinct<T, TKey>(this IEnumerable<T> source, Func<T, TKey> selector)
    {
        return source.GroupBy(selector).Select(x => x.Key);
    }
}

এটি একটি লজ্জার বিষয় যে তারা ফ্রেমওয়ার্কে এই জাতীয় কোনও আলাদা পদ্ধতি বানােনি, তবে ওহে হো।


এই লাইব্রেরিটিকে আরও লিঙ্ক যুক্ত না করেই এটি সেরা সমাধান।
টুডমো

কিন্তু, আমি পরিবর্তন করতে হয়েছিল x.Keyকরার x.First()এবং ফিরে মান পরিবর্তনIEnumerable<T>
toddmo

@ টডডমো ফিডব্যাকের জন্য ধন্যবাদ :-) হ্যাঁ, যৌক্তিক মনে হচ্ছে ... আরও তদন্তের পরে উত্তরটি আপডেট করব।
ডেভিড কির্কল্যান্ড

1
সহজ এবং পরিষ্কার
আলী

4

আমি এমন কিছু ব্যবহার করেছি যা আমার পক্ষে ভালভাবে কাজ করেছে।

/// <summary>
/// A class to wrap the IEqualityComparer interface into matching functions for simple implementation
/// </summary>
/// <typeparam name="T">The type of object to be compared</typeparam>
public class MyIEqualityComparer<T> : IEqualityComparer<T>
{
    /// <summary>
    /// Create a new comparer based on the given Equals and GetHashCode methods
    /// </summary>
    /// <param name="equals">The method to compute equals of two T instances</param>
    /// <param name="getHashCode">The method to compute a hashcode for a T instance</param>
    public MyIEqualityComparer(Func<T, T, bool> equals, Func<T, int> getHashCode)
    {
        if (equals == null)
            throw new ArgumentNullException("equals", "Equals parameter is required for all MyIEqualityComparer instances");
        EqualsMethod = equals;
        GetHashCodeMethod = getHashCode;
    }
    /// <summary>
    /// Gets the method used to compute equals
    /// </summary>
    public Func<T, T, bool> EqualsMethod { get; private set; }
    /// <summary>
    /// Gets the method used to compute a hash code
    /// </summary>
    public Func<T, int> GetHashCodeMethod { get; private set; }

    bool IEqualityComparer<T>.Equals(T x, T y)
    {
        return EqualsMethod(x, y);
    }

    int IEqualityComparer<T>.GetHashCode(T obj)
    {
        if (GetHashCodeMethod == null)
            return obj.GetHashCode();
        return GetHashCodeMethod(obj);
    }
}

@ মুকুস আমি নিশ্চিত নই আপনি এখানে শ্রেণীর নাম সম্পর্কে কেন জিজ্ঞাসা করছেন? আইক্যুয়ালিম্প্যাকার বাস্তবায়নের জন্য আমার ক্লাসের কিছু নামকরণ করা দরকার যাতে আমি সবেমাত্র আমার উপসর্গ করেছি।
ক্লিনাক্স

4

আমি এখানে যে সমস্ত সমাধান দেখেছি তা ইতিমধ্যে তুলনামূলক ক্ষেত্র নির্বাচন করার উপর নির্ভর করে। যদি কারও আলাদা উপায়ে তুলনা করা প্রয়োজন তবে এই সমাধানটি এখানে সাধারণভাবে কাজ করছে বলে মনে হয় যেমন:

somedoubles.Distinct(new LambdaComparer<double>((x, y) => Math.Abs(x - y) < double.Epsilon)).Count()

ল্যাম্বডাকম্পারার কী, আপনি কোথা থেকে এটি আমদানি করছেন?
প্যাট্রিক গ্রাহাম

@ পেট্রিকগ্রাহাম উত্তরে লিঙ্ক করেছেন: brendan.enrick.com/post/…
দিমিত্রি লেডেন্টসভ

3

অন্য উপায় নিন:

var distinctValues = myCustomerList.
Select(x => x._myCaustomerProperty).Distinct();

অনুক্রমের ফেরত স্বতন্ত্র উপাদানগুলি তাদের সম্পত্তি '_myCaustomerProperty' দিয়ে তুলনা করে।


1
এই বলে এখানে এসেছে। এই গৃহীত উত্তর হওয়া উচিত
Still.Tony

5
না, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়, যতক্ষণ না আপনি চান কাস্টম সম্পত্তির স্বতন্ত্র মান values সাধারণ ও.পি. প্রশ্নটি ছিল কীভাবে বস্তুর নির্দিষ্ট সম্পত্তির উপর ভিত্তি করে স্বতন্ত্র বস্তুগুলি ফিরিয়ে আনতে হবে।
টোমো

2

আপনি ইনলাইন কম্পিউটার ব্যবহার করতে পারেন

public class InlineComparer<T> : IEqualityComparer<T>
{
    //private readonly Func<T, T, bool> equalsMethod;
    //private readonly Func<T, int> getHashCodeMethod;
    public Func<T, T, bool> EqualsMethod { get; private set; }
    public Func<T, int> GetHashCodeMethod { get; private set; }

    public InlineComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
    {
        if (equals == null) throw new ArgumentNullException("equals", "Equals parameter is required for all InlineComparer instances");
        EqualsMethod = equals;
        GetHashCodeMethod = hashCode;
    }

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

    public int GetHashCode(T obj)
    {
        if (GetHashCodeMethod == null) return obj.GetHashCode();
        return GetHashCodeMethod(obj);
    }
}

ব্যবহারের নমুনা :

  var comparer = new InlineComparer<DetalleLog>((i1, i2) => i1.PeticionEV == i2.PeticionEV && i1.Etiqueta == i2.Etiqueta, i => i.PeticionEV.GetHashCode() + i.Etiqueta.GetHashCode());
  var peticionesEV = listaLogs.Distinct(comparer).ToList();
  Assert.IsNotNull(peticionesEV);
  Assert.AreNotEqual(0, peticionesEV.Count);

উত্স: https://stackoverflow.com/a/5969691/206730
ইউনিয়নের জন্য IEqualityComparer ব্যবহার করে
আমি কি আমার স্পষ্টত ধরণের তুলনাকারী ইনলাইন নির্দিষ্ট করতে পারি?


2

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

var distinctValues
    = myCustomerList.Distinct(new LambdaEqualityComparer<OurType>((c1, c2) => c1.CustomerId == c2.CustomerId));


public class LambdaEqualityComparer<T> : IEqualityComparer<T>
    {
        public LambdaEqualityComparer(Func<T, T, bool> equalsFunction)
        {
            _equalsFunction = equalsFunction;
        }

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

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

        private readonly Func<T, T, bool> _equalsFunction;
    }

1

এটি করার একটি কৌতূহল উপায় হ'ল কী হিসাবে সম্পত্তি- মূল্যের মান Aggregate()সহ সংযোজক হিসাবে অভিধান ব্যবহার করে এক্সটেনশন ব্যবহার করা :

var customers = new List<Customer>();

var distincts = customers.Aggregate(new Dictionary<int, Customer>(), 
                                    (d, e) => { d[e.CustomerId] = e; return d; },
                                    d => d.Values);

এবং একটি গ্রুপবাই-স্টাইলের সমাধানটি ব্যবহার করছে ToLookup():

var distincts = customers.ToLookup(c => c.CustomerId).Select(g => g.First());

চমৎকার, তবে কেন কেবল Dictionary<int, Customer>তার পরিবর্তে তৈরি করবেন না?
রাফিন

0

আমি ধরে নিচ্ছি আপনার কাছে একটি IEnumerable আছে, এবং আপনার উদাহরণের প্রতিনিধি হিসাবে, আপনি চান সি 1 এবং সি 2 এই তালিকার দুটি উপাদানকে উল্লেখ করছেন?

আমি বিশ্বাস করি যে আপনি স্ব-যোগদানের মাধ্যমে এটি অর্জন করতে পেরেছেন পৃথক ফলাফল = মাইলিস্টে সি 1 থেকে মাইলিস্টে সি 2 এ যোগ দিন


0

যদি Distinct()অনন্য ফলাফল না আসে তবে এটি ব্যবহার করে দেখুন:

var filteredWC = tblWorkCenter.GroupBy(cc => cc.WCID_I).Select(grp => grp.First()).Select(cc => new Model.WorkCenter { WCID = cc.WCID_I }).OrderBy(cc => cc.WCID); 

ObservableCollection<Model.WorkCenter> WorkCenter = new ObservableCollection<Model.WorkCenter>(filteredWC);

0

মাইক্রোসফট System.Interactive প্যাকেজ যে একটি কী নির্বাচক ল্যামডা লাগে স্বতন্ত্র একটি সংস্করণ রয়েছে। এটি কার্যকরভাবে জোন স্কিটের সমাধানের সমান, তবে লোকেরা জানার জন্য এবং লাইব্রেরির বাকী অংশগুলি পরীক্ষা করতে এটি সহায়ক হতে পারে।


0

আপনি এটি কীভাবে করতে পারেন তা এখানে:

public static class Extensions
{
    public static IEnumerable<T> MyDistinct<T, V>(this IEnumerable<T> query,
                                                    Func<T, V> f, 
                                                    Func<IGrouping<V,T>,T> h=null)
    {
        if (h==null) h=(x => x.First());
        return query.GroupBy(f).Select(h);
    }
}

এই পদ্ধতিটি আপনাকে এটির মতো একটি প্যারামিটার নির্দিষ্ট করে ব্যবহার করতে দেয় .MyDistinct(d => d.Name)তবে এটি আপনাকে দ্বিতীয় প্যারামিটার হিসাবে শর্ত হিসাবে নির্দিষ্ট করার অনুমতি দেয়:

var myQuery = (from x in _myObject select x).MyDistinct(d => d.Name,
        x => x.FirstOrDefault(y=>y.Name.Contains("1") || y.Name.Contains("2"))
        );

এনবি আপনাকে উদাহরণস্বরূপ অন্যান্য ফাংশন নির্দিষ্ট করার অনুমতি দেয় .LastOrDefault(...)


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

public static IEnumerable<T> MyDistinct2<T, V>(this IEnumerable<T> query,
                                                Func<T, V> f,
                                                Func<T,bool> h=null
                                                )
{
    if (h == null) h = (y => true);
    return query.GroupBy(f).Select(x=>x.FirstOrDefault(h));
}

এই ক্ষেত্রে, ক্যোয়ারীটি ঠিক এর মতো দেখাবে:

var myQuery2 = (from x in _myObject select x).MyDistinct2(d => d.Name,
                    y => y.Name.Contains("1") || y.Name.Contains("2")
                    );

এনবি এখানে, অভিব্যক্তিটি সহজ, তবে নোটটি স্পষ্টভাবে .MyDistinct2ব্যবহার করে .FirstOrDefault(...)


দ্রষ্টব্য: উপরের উদাহরণগুলি নীচের ডেমো ক্লাসটি ব্যবহার করছে

class MyObject
{
    public string Name;
    public string Code;
}

private MyObject[] _myObject = {
    new MyObject() { Name = "Test1", Code = "T"},
    new MyObject() { Name = "Test2", Code = "Q"},
    new MyObject() { Name = "Test2", Code = "T"},
    new MyObject() { Name = "Test5", Code = "Q"}
};

0

IEnumerable লাম্বদা এক্সটেনশন:

public static class ListExtensions
{        
    public static IEnumerable<T> Distinct<T>(this IEnumerable<T> list, Func<T, int> hashCode)
    {
        Dictionary<int, T> hashCodeDic = new Dictionary<int, T>();

        list.ToList().ForEach(t => 
            {   
                var key = hashCode(t);
                if (!hashCodeDic.ContainsKey(key))
                    hashCodeDic.Add(key, t);
            });

        return hashCodeDic.Select(kvp => kvp.Value);
    }
}

ব্যবহার:

class Employee
{
    public string Name { get; set; }
    public int EmployeeID { get; set; }
}

//Add 5 employees to List
List<Employee> lst = new List<Employee>();

Employee e = new Employee { Name = "Shantanu", EmployeeID = 123456 };
lst.Add(e);
lst.Add(e);

Employee e1 = new Employee { Name = "Adam Warren", EmployeeID = 823456 };
lst.Add(e1);
//Add a space in the Name
Employee e2 = new Employee { Name = "Adam  Warren", EmployeeID = 823456 };
lst.Add(e2);
//Name is different case
Employee e3 = new Employee { Name = "adam warren", EmployeeID = 823456 };
lst.Add(e3);            

//Distinct (without IEqalityComparer<T>) - Returns 4 employees
var lstDistinct1 = lst.Distinct();

//Lambda Extension - Return 2 employees
var lstDistinct = lst.Distinct(employee => employee.EmployeeID.GetHashCode() ^ employee.Name.ToUpper().Replace(" ", "").GetHashCode()); 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.