LINQ डिस्टि्रक्ट ऑपरेटर, मामले की अनदेखी?


95

निम्नलिखित सरल उदाहरण दिए गए हैं:

    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();

ऐसा प्रतीत होता है कि CaseInsensitiveComparer वास्तव में केस-असंवेदनशील तुलना करने के लिए उपयोग नहीं किया जा रहा है।

दूसरे शब्दों में, विशिष्ट सूची में सूची के समान आइटम शामिल हैं । इसके बजाय मैं उम्मीद करूंगा, उदाहरण के लिए, "तीन" और "तीन" को समान माना जाएगा।

क्या मुझे कुछ याद आ रहा है या यह डिस्टिक्ट ऑपरेटर के साथ कोई समस्या है?

जवाबों:


229

StringComparer आपको क्या चाहिए:

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

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

(या आप जिस डेटा की तुलना कर रहे हैं, उसके आधार पर अपरिवर्तनीय / क्रमिक / आदि)


5

[देखें मार्क ग्रेवेल्स का जवाब अगर आप सबसे संक्षिप्त दृष्टिकोण चाहते हैं]

ब्रैडली ग्रिंगर की कुछ जांच और अच्छी प्रतिक्रिया के बाद मैंने निम्नलिखित IEqualityComparer को लागू किया है। यह एक मामले को असंवेदनशील डिस्टि्रक्ट () बयान में परिवर्तित कर देता है (बस डिस्टिग्रेट ऑपरेटर को इसका एक उदाहरण दें):

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
आपको बस इसकी आवश्यकता नहीं है मेरा जवाब देखिए।
मार्क Gravell

2
हां, आपका उत्तर ठीक वैसे ही आया जैसे मैं "पोस्ट योर आंसर" पर क्लिक कर रहा था।
ऐश

वे निश्चित रूप से एक दूसरे के 20 सेकंड के साथ थे, मुझे याद है। फिर भी, IEqualityComparer <टी> की तरह कुछ को लागू करने में अभी भी एक उपयोगी व्यायाम है, केवल समझने के लिए यह कैसे काम करता ... अगर
मार्क Gravell

फिर से धन्यवाद, मैं इसे इस उत्तर को तब तक जीवित रहने दूंगा, जब तक कि कोई भी दृढ़ता से ऑब्जेक्ट नहीं करता।
ऐश

ट्र-टीआर संस्कृति के लिए आरंभीकृत होने पर यह नमूना विफल हो जाता है यदि वर्तमान संस्कृति एन-यूएस है, क्योंकि गेटहैशकोड I (U + 0049) और ı (U + 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

3
कृपया स्पष्टीकरण के बिना कोड स्निपेट पोस्ट करने से बचें। अपना उत्तर संपादित करें और उसमें एक निकाय जोड़ें। धन्यवाद।
क्लीजर्स

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.