簡體   English   中英

收集行為中的奇怪C#結構

[英]Strange C# struct in collection behaviour

關於為什么這樣的任何想法

    public Collection<Point> data = new Collection<Point>(){
            new Point{X=10,Y=20},
            new Point{X=20,Y=30},
            new Point{X=40,Y=20},
            new Point{X=10,Y=20}
           };

(注意相同的第一個和最后一個元素)給出錯誤

已添加具有相同鍵的項目。

如果您將最后一個元素更改為Y = 20.1或任何使其不同的元素,則它可以正常工作。 您也可以隨意添加元素並獲得相同的結果。

問題顯然是由於Point是一個值類型,因為如果你定義並使用一個點類它會消失,我知道在其他集合類型中使用結構有問題,但這與值和ref返回的區別有關類型。 令我神秘的是,如果所有結構具有不同的字段值,則此方法有效。

原因是因為值類型的相等性基於其值 - 對於struct,它在所有字段中是相等的。

引用類型相等性基於引用本身,因此起作用。 將結構值更改為全部不同也有效。

如果你只想要一個東西列表,只需使用List<Point> ,我認為這將接受重復。

更新:看起來您的集合類正在檢測重復的條目,並且您正在嘗試添加重復項。 如果你想添加重復項,我會說你不能使用這個類。

您是否嘗試過使用List? 我認為它應該工作!

希望有所幫助!

我不熟悉你正在使用的這個集合類,但顯然它不允許有多個項目。 與SET集合一樣。 所以我猜你正在使用的Collection相當於:

Dictionary<String, Point>

但既然你沒有鑰匙,那就更像了

HashSet<Point>

就像你的集合類一樣,HashSet要求所有鍵都是唯一的 就像Kieren提到的那樣,List會更適合你。 列表允許多個條目相同。

實際上,如果Point是一個類,它將允許重復,因為Objec1!= Object2即使它們的值相同也是如此。

我真的不確定這一點,但我有一種感覺,因為編譯器生成一個強大的Collections項,不需要box / unbox值類型,鍵檢查是在顯式值類型本身上完成的,這會產生重復的關鍵異常?

那真的只是在黑暗中拍攝!

什么是Collection類。 它不是.NET Framework庫類。 看看這個類的文檔或來源,它可以解釋這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM