লিনকুই: স্বতন্ত্র মান


136

আমি এক্সএমএল থেকে নিম্নলিখিত আইটেম সেট করা আছে:

id           category

5            1
5            3
5            4
5            3
5            3

আমার এই আইটেমগুলির একটি স্বতন্ত্র তালিকা প্রয়োজন:

5            1
5            3
5            4

আমি কীভাবে ল্যাংকিউতে বিভাগ এবং আইডির জন্য আলাদা করতে পারি?

উত্তর:


221

আপনি কি একাধিক ক্ষেত্র দ্বারা আলাদা হওয়ার চেষ্টা করছেন? যদি তা হয় তবে কেবল একটি বেনামে টাইপ এবং ডিসট্রিন্ট অপারেটর ব্যবহার করুন এবং এটি ঠিক হওয়া উচিত:

var query = doc.Elements("whatever")
               .Select(element => new {
                             id = (int) element.Attribute("id"),
                             category = (int) element.Attribute("cat") })
               .Distinct();

যদি আপনি "বৃহত্তর" ধরণের মানগুলির একটি পৃথক সেট পেতে চেষ্টা করছেন তবে স্বতন্ত্রতার দিকের জন্য বৈশিষ্ট্যের কিছু উপসর্গের দিকে তাকালে আপনি সম্ভবত মোরলিনিকুতেDistinctBy প্রয়োগ করেছেন :DistinctBy.cs

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

(আপনি যদি nullতুলনাকারী হিসাবে পাস করেন তবে এটি মূল ধরণের জন্য ডিফল্ট তুলনামূলক ব্যবহার করবে))


ওহ তাই "বৃহত্তর প্রকার" দ্বারা আপনি বোঝাতে পারেন যে আমি এখনও ফলাফলের সমস্ত সম্পত্তি চাই যদিও আমি কেবল স্বতন্ত্রতা নির্ধারণের জন্য কয়েকটি বৈশিষ্ট্যের তুলনা করতে চাই?
লাল মটর 14

@ দ্য রেডপিয়া: হ্যাঁ, ঠিক
জন স্কেটি


27

জন স্কিটির উত্তর ছাড়াও, আপনি প্রতিটি গ্রুপ পুনরাবৃত্তির জন্য ডাব্লু / একটি গণনা বরাবর অনন্য গ্রুপগুলি পেতে এক্সপ্রেশন দিয়ে গ্রুপটি ব্যবহার করতে পারেন:

var query = from e in doc.Elements("whatever")
            group e by new { id = e.Key, val = e.Value } into g
            select new { id = g.Key.id, val = g.Key.val, count = g.Count() };

4
আপনি লিখেছেন "জোন স্কিটের উত্তর ছাড়াও" ... আমি জানি না এ জাতীয় জিনিস সম্ভব কিনা কিনা। ;)
ইয়াহুদা মাকারভ

13

এখনও খুঁজছেন যে কেউ জন্য; এখানে একটি কাস্টম ল্যাম্বদা তুলক প্রয়োগ করার অন্য উপায়।

public class LambdaComparer<T> : IEqualityComparer<T>
    {
        private readonly Func<T, T, bool> _expression;

        public LambdaComparer(Func<T, T, bool> lambda)
        {
            _expression = lambda;
        }

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

        public int GetHashCode(T obj)
        {
            /*
             If you just return 0 for the hash the Equals comparer will kick in. 
             The underlying evaluation checks the hash and then short circuits the evaluation if it is false.
             Otherwise, it checks the Equals. If you force the hash to be true (by assuming 0 for both objects), 
             you will always fall through to the Equals check which is what we are always going for.
            */
            return 0;
        }
    }

আপনি তার পরে লম্বা ডিস্টিন্টের জন্য এক্সটেনশন তৈরি করতে পারেন

   public static IEnumerable<T> Distinct<T>(this IEnumerable<T> list,  Func<T, T, bool> lambda)
        {
            return list.Distinct(new LambdaComparer<T>(lambda));
        }  

ব্যবহার:

var availableItems = list.Distinct((p, p1) => p.Id== p1.Id);

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

ভাল যুক্তি! আমি যখন সময় পাই তখন আমি সম্পাদনার চেষ্টা করব, আপনি যদি এই মুহুর্তে এই ডোমেনে কাজ করছেন তবে নির্দ্বিধায় সম্পাদনা করুন
রিকি জি

8

উত্তরের জন্য আমি কিছুটা দেরি করছি, তবে আপনি পুরো উপাদানটি চাইলে এটিগুলি করতে চান তবে আপনি যে মানগুলি দ্বারা ভাগ করতে চান তা নয়:

var query = doc.Elements("whatever")
               .GroupBy(element => new {
                             id = (int) element.Attribute("id"),
                             category = (int) element.Attribute("cat") })
               .Select(e => e.First());

এটি আপনাকে নির্বাচনের মাধ্যমে আপনার গোষ্ঠীর সাথে মেলে প্রথম পুরো উপাদানটি দেবে, অনেকটা ডিস্টিন্টবাই ব্যবহার করে জোন স্কিটের দ্বিতীয় উদাহরণ যেমন আইক্যুয়ালিপি কম্পিউটারের তুলনামূলক প্রয়োগ না করে। ডিসট্রিন্টবাই সম্ভবত খুব দ্রুততর হবে, তবে পারফরম্যান্স কোনও সমস্যা না হলে উপরের সমাধানটিতে কম কোড জড়িত।


4
// First Get DataTable as dt
// DataRowComparer Compare columns numbers in each row & data in each row

IEnumerable<DataRow> Distinct = dt.AsEnumerable().Distinct(DataRowComparer.Default);

foreach (DataRow row in Distinct)
{
    Console.WriteLine("{0,-15} {1,-15}",
        row.Field<int>(0),
        row.Field<string>(1)); 
}

0

যেহেতু আমরা প্রতিটি উপাদান হুবহু একবার করার কথা বলছি, একটি "সেট" আমার কাছে আরও অর্থবোধ করে।

ক্লাস এবং আইক্যুয়ালিম্প্যাকার সহ উদাহরণ প্রয়োগ করা হয়েছে:

 public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public Product(int x, string y)
        {
            Id = x;
            Name = y;
        }
    }

    public class ProductCompare : IEqualityComparer<Product>
    {
        public bool Equals(Product x, Product y)
        {  //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(x, y)) return true;

            //Check whether any of the compared objects is null.
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;

            //Check whether the products' properties are equal.
            return x.Id == y.Id && x.Name == y.Name;
        }
        public int GetHashCode(Product product)
        {
            //Check whether the object is null
            if (Object.ReferenceEquals(product, null)) return 0;

            //Get hash code for the Name field if it is not null.
            int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

            //Get hash code for the Code field.
            int hashProductCode = product.Id.GetHashCode();

            //Calculate the hash code for the product.
            return hashProductName ^ hashProductCode;
        }
    }

এখন

List<Product> originalList = new List<Product> {new Product(1, "ad"), new Product(1, "ad")};
var setList = new HashSet<Product>(originalList, new ProductCompare()).ToList();

setList অনন্য উপাদান থাকবে

আমি এটি নিয়ে কাজ করার সময় ভেবেছিলাম .Except()যা কোন সেট-পার্থক্য দেয়

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