2010-04-27 24 views
7

मैं अपने SortedDictionary < के लिए अपने कस्टम IComparer उपयोग करने के लिए> की समस्या आ रही हूँ। लक्ष्य ईमेल पते को एक विशिष्ट प्रारूप ([email protected]) में कुंजी के रूप में रखना है, और अंतिम नाम से सॉर्ट करना है। जब मैं कुछ इस तरह करते हैं: मैं इस ArgumentException मिलसॉर्टेड डिक्शनरी के लिए कस्टम आईसीओएमपेयर का उपयोग कैसे करें?

public class Program 
{ 
    public static void Main(string[] args) 
    { 
    SortedDictionary<string, string> list = new SortedDictionary<string, string>(new SortEmailComparer()); 
    list.Add("[email protected]", "value1"); 
    list.Add("[email protected]", "value2"); 
    foreach (KeyValuePair<string, string> kvp in list) 
    { 
     Console.WriteLine(kvp.Key); 
    } 
    Console.ReadLine(); 
    } 
} 

public class SortEmailComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
    Regex regex = new Regex("\\b\\w*@\\b", 
         RegexOptions.IgnoreCase 
         | RegexOptions.CultureInvariant 
         | RegexOptions.IgnorePatternWhitespace 
         | RegexOptions.Compiled 
         ); 

    string xLastname = regex.Match(x).ToString().Trim('@'); 
    string yLastname = regex.Match(y).ToString().Trim('@'); 
    return xLastname.CompareTo(yLastname); 
    } 
} 

: An entry with the same key already exists. जब दूसरे मद जोड़ने।

मैं पहले एक SortedDictionary के लिए एक कस्टम IComparer साथ काम किया है नहीं, और मैं अपने त्रुटि को देखने के लिए असफल, मैं गलत क्या कर रहा हूँ?

उत्तर

4

2 lastNames बराबर तो जैसे उदाहरण के लिए तुलना कर रहे हैं पूरे ईमेल:

int comp = xLastname.CompareTo(yLastname); 
if (comp == 0) 
    return x.CompareTo(y); 
return comp; 

वास्तव में, sorteddictionary तुलना भी चाबियाँ के बीच भेद करने के लिए * है, तो आप एक पूरा तुलना (न केवल निर्दिष्ट करना होगा प्रयोग किया जाता है आपके छँटाई रणनीति)

संपादित करें: * मेरा मतलब है अगर comparer 0

+0

धन्यवाद। यह सरल सुरुचिपूर्ण समाधान था। –

1

ठीक है, मैं अलग अपने comparer नहीं किया है - लेकिन जैसे कि यह सिर्फ अंतिम नाम से तुलना कर रहा है यह लग रहा है, और आप एक ही अंतिम नाम (जोहानसन) दो बार जोड़ने की कोशिश कर रहे हैं। यही कारण है कि आप एक ArgumentException देना चाहिए।

आप क्या करना चाहता था होने की - और क्या आप चाहते अपने comparer करने के लिए करते हैं?

शायद आप अंतिम नाम द्वारा क्रमबद्ध करना चाहते हैं और फिर पहले नाम? इस तरह आपके पास एक ही अंतिम नाम के साथ दो ईमेल पते हो सकते हैं लेकिन अलग-अलग नाम हैं, और उन्हें अभी भी एक साथ शब्दकोश में होना चाहिए, पहले नाम से आदेश दिया गया है।

+0

देता दरअसल, अपने पूर्वानुमान सही हैं sortedDictionary में 2 चाबियाँ बराबर हैं। @digEmAll ने जिस समाधान को मैं चाहता था, प्रदान किया, और @ फॉक्सफायर ने समझाया क्यों। –