2013-02-07 19 views
4

由於不可變的數據結構是一流的值,所以我們可以比較它們的相等性或順序,就像我們對任何其他值所做的一樣。但BCL不可變集合預覽中的事情變得複雜起來,因爲每個不可變集合都可以通過參數化爲IEqualityComparer<T>/IComparer<T>實例。貌似不同comparers不可改變的集合不應該被允許進行比較(因爲平等不是comparers本身定義的),因爲它使平等關係的非對稱:BCL不可變集合:平等是非對稱的

var xs = ImmutableList<string>.Empty.Add("AAA") 
    .WithComparer(StringComparer.OrdinalIgnoreCase); 

var ys = ImmutableList<string>.Empty.Add("aaa") 
    .WithComparer(StringComparer.Ordinal); 

Console.WriteLine(xs.Equals(ys)); // true 
Console.WriteLine(ys.Equals(xs)); // false 

將這種行爲以某種方式固定?

+2

既然他們有不同的平等,你會如何解決它?它有點合理,它使用第一個操作數的比較器 - 我不知道我可以稱它爲一個bug ... –

+1

這讓我很難解決。這是一個CTP。唯一能解決這個問題的方法就是當你通過CTP的指定反饋渠道提供反饋時。博客文章中有一個鏈接,「請求反饋部分」。 http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx –

+1

我傾向於贊同Marc的推理。 –

回答

3

平等是一個難以定義的問題,甚至更難以在智能工程師的房間中達成共識。 :) 實際上,我們將EqualsGetHashCode中刪除值相等,以便這些方法提供與BCL中和客戶代碼中的大多數其他類型相同的速度(並且幾乎無用) 。

我們非常希望在未來的版本中爲不變集合添加值均等方法。

+0

謝謝你的回答,安德魯。看起來好主意。 – ControlFlow