2015-09-07 2 views
0

Я использую .NET 4.6, и я испытал серьезную странность. Я пытаюсь получить IEnumerable из всех значений из отсортированного набора, которые НЕ являются нечувствительными к регистру эквивалентами переданных в IEnumerable. Из того, что я понимаю, это работа Except.SortedSet <string> Linq. Исключительно с странностью стран сравнения

У меня есть класс, CaseInsensitiveComparer который реализуется следующим образом:

public class CaseInsensitiveComparer : IComparer<string>, IEqualityComparer<string> 
{ 
    public static CaseInsensitiveComparer Instance { get; private set; } 
    static CaseInsensitiveComparer() 
    { 
     Instance = new CaseInsensitiveComparer(); 
    } 

    public int Compare(string a, string b) 
    { 
     var ret = string.Compare(a, b, true); 
     return ret; 
    } 

    public bool Equals(string a, string b) 
    { 
     return Compare(a, b) == 0; 
    } 

    public int GetHashCode(string a) 
    { 
     return a.GetHashCode(); 
    } 
} 

Я использую это так:

public void DotNetWeirdness() 
    { 
     var a = new SortedSet<string>(); 
     a.Add("A"); 
     var b = a.Except(new string[] { "a" }, CaseInsensitiveComparer.Instance); 
    } 

Значение Ь есть IEnumerable, содержащий А. Так как я запрашивая все значения в SortedSet, за исключением a/A, не должен ли я иметь пустой набор в качестве результата? Я очень смущен этим.

Спасибо!

+2

Вы не писать 'GetHashCode' возвращать то же значение для' 'Ā' и Ā'. – Blorgbeard

ответ

2

Проблема в том, что вы не переопределяете GetHashCode. "A".GetHashCode() возвращает другое значение от "a".GetHashCode().

Быстрый способ исправить это изменить GetHashCode функцию следующим образом:

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

Кроме того, вы знаете о StringComparer? Вы можете изменить свой код на этот:

var b = a.Except(new string[] { "a" }, StringComparer.InvariantCultureIgnoreCase); 

И не придется беспокоиться о реализации собственного компаратора

+1

Это точно. Кроме того, большое спасибо за StringComparer. Я думаю, что в какой-то момент я прочитал об этом и либо забыл об этом, либо не работал на какой-то другой код в системе или что-то в этом роде. В любом случае, большое спасибо за исправление и понимание! – Travis

+0

@Travis Приветствую друга :) – Rob