2013-04-17 48 views
0

我不太確定爲什麼按IEnumerable<string>分組無效。當然,我提供自定義的IEqualityComparer。按IEnumerable分組<string>根本不起作用

public class StringCollectionEqualityComparer : EqualityComparer<IEnumerable<string>> 
{ 
    public override bool Equals(IEnumerable<string> x, IEnumerable<string> y) 
    { 
     if (Object.Equals(x, y) == true) 
      return true; 
     if (x == null) return y == null; 
     if (y == null) return x == null; 

     return x.SequenceEqual(y, StringComparer.OrdinalIgnoreCase); 
    } 

    public override int GetHashCode(IEnumerable<string> obj) 
    { 
     return obj.OrderBy(value => value, StringComparer.OrdinalIgnoreCase).Aggregate(0, (hashCode, value) => value == null ? hashCode : hashCode^value.GetHashCode() + 33); 
    } 
} 

class A 
{ 
    public IEnumerable<string> StringCollection { get; set; } 
} 

IEnumerable<A> collection = // collection of A 

var grouping = collection.GroupBy(obj => a.StringCollection, StringCollectionEqualityComparer.Default).ToList(); 

ToList()很給力的評價,我有斷點StringCollectionEqualityComparer,但不幸的是,他們沒有援引,如預期)

當我在這個方式組collection,它實際上有效。

var grouping = collection.GroupBy(obj => String.Join("|", obj.StringCollection)); 

不幸的是,顯然這不是我想用的東西。

通過不工作,我的意思是結果不是我期望的結果(使用愚蠢的方式,結果是正確的)。

回答

6

StringCollectionEqualityComparer.Default是訪問EqualityComparer<IEnumerable<string>>.Default的有效替代方式,因爲後者是前者的基類。您需要創建一個StringCollectionEqualityComparer的實例,只需使用new StringCollectionEqualityComparer()即可。

+0

謝謝!看起來我對泛型和這個「問題」有一些額外的學習。現在我知道,爲什麼我的自定義'EqualityComparer's失敗:) – mnn

+2

很高興它有幫助,但它實際上並沒有涉及到泛型。基類的靜態成員總是可以通過派生類型進行訪問,這就是爲什麼看似不可感知的代碼,比如'if(int.Equals(1.2,「wtf」)){...}'是有效的:實際調用'object.Equals (1.2,「wtf」)。 – hvd

+0

感謝您的澄清。我相信我已經知道.NET Framework的低級部分。下一次,我不會承擔任何事情。 – mnn