লিনকিউ ডিসট্রিন্ট অপারেটর, কেস উপেক্ষা করবেন?


98

নিম্নলিখিত সাধারণ উদাহরণ দেওয়া:

    List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };

    CaseInsensitiveComparer ignoreCaseComparer = new CaseInsensitiveComparer();

    var distinctList = list.Distinct(ignoreCaseComparer as IEqualityComparer<string>).ToList();

এটি প্রদর্শিত হয় কেসআইসেনসেটিভ কমপ্লেয়ার আসলে কেস-সংবেদনশীল তুলনা করতে ব্যবহৃত হয় না।

অন্য কথায় distinctList হিসাবে আইটেম একই সংখ্যা উপস্থিত রয়েছে তালিকা । পরিবর্তে আমি আশা করব, উদাহরণস্বরূপ, "তিন" এবং "তিন" সমান বলে বিবেচিত হবে।

আমি কি কিছু মিস করছি বা এটি ডিসট্রিন্ট অপারেটরের কোনও সমস্যা?

উত্তর:


236

StringComparer আপনার যা প্রয়োজন তা করে:

List<string> list = new List<string>() {
    "One", "Two", "Three", "three", "Four", "Five" };

var distinctList = list.Distinct(
    StringComparer.CurrentCultureIgnoreCase).ToList();

(অথবা আপনি যে ডেটা তুলনা করছেন তার উপর নির্ভর করে আক্রমণকারী / অর্ডিনাল / ইত্যাদি)


5

[আপনি যদি সর্বাধিক সংক্ষিপ্ত পদ্ধতির চান তবে মার্ক গ্র্যাভেলসের উত্তর দেখুন]

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

class IgnoreCaseComparer : IEqualityComparer<string>
{
    public CaseInsensitiveComparer myComparer;

    public IgnoreCaseComparer()
    {
        myComparer = CaseInsensitiveComparer.DefaultInvariant;
    }

    public IgnoreCaseComparer(CultureInfo myCulture)
    {
        myComparer = new CaseInsensitiveComparer(myCulture);
    }

    #region IEqualityComparer<string> Members

    public bool Equals(string x, string y)
    {
        if (myComparer.Compare(x, y) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public int GetHashCode(string obj)
    {
        return obj.ToLower().GetHashCode();
    }

    #endregion
}

6
আপনার কেবল এটির দরকার নেই। আমার উত্তর দেখুন।
মার্ক গ্র্যাভেল

4
হ্যাঁ, আমি আপনার উত্তরটি পোস্ট করুন ঠিক তেমনই আপনার উত্তর এসেছিল।
অ্যাশ

তারা অবশ্যই একে অপরের সাথে <20 সেকেন্ডের সাথে ছিল, আমি মনে করি। তবুও, আইক্যুয়ালিটি কম্পিউটারের <টি> এর মতো কিছু বাস্তবায়ন এখনও একটি কার্যকর অনুশীলন, যদি এটি বুঝতে পারে কেবল এটি কীভাবে কাজ করে ...
মার্ক গ্র্যাভেল

আবার ধন্যবাদ, আমি এই উত্তরটি তখনই বাঁচতে দেব, যদি না কেউ দৃ strongly়ভাবে আপত্তি করে।
অ্যাশ

এই সংস্করণটি ত্রি-টিআর সংস্কৃতির জন্য আরম্ভ করার সময় ব্যর্থ হয় যদি বর্তমান সংস্কৃতিটি এন-ইউএস হয়, কারণ গেটহ্যাশকোড আই (ইউ + 0049) এবং ı (ইউ + 0131) এর জন্য বিভিন্ন মানের প্রতিবেদন করবে, যেখানে সমানগুলি তাদের সমান বিবেচনা করবে।
ব্র্যাডলি গ্রেনার

1

 ## Distinct Operator( Ignoring Case) ##
  string[] countries = {"USA","usa","INDIA","UK","UK" };

  var result = countries.Distinct(StringComparer.OrdinalIgnoreCase);

  foreach (var v in result) 
  { 
  Console.WriteLine(v);
  }

আউটপুট হবে

   USA 
   INDIA
   UK

4
দয়া করে কোনও ব্যাখ্যা ছাড়াই কোড স্নিপেটগুলি পোস্ট করা এড়িয়ে চলুন। আপনার উত্তর সম্পাদনা করুন এবং এটিতে একটি শরীর যুক্ত করুন। ধন্যবাদ
ক্লায়স্টাররা

0

এখানে একটি সহজ সংস্করণ।

List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };

var z = (from x in list select new { item = x.ToLower()}).Distinct();

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