收集行为中的奇怪C#结构

时间:2010-07-13 09:28:58

标签: c# struct collections

关于为什么会这样做的任何想法

    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返回类型。让我神秘的是,如果所有结构都有不同的字段值,这就有效。

5 个答案:

答案 0 :(得分:6)

原因是因为值类型的相等性基于其值 - 对于struct,它在所有字段中是相等的。

引用类型相等性基于引用本身,因此起作用。将结构值更改为全部不同也有效。

如果你只想要一个东西列表,只需使用List<Point>,我认为这将接受重复。

更新:您的集合类似乎检测到重复的条目,并且您正在尝试添加重复项。如果你想添加重复项,我会说你不能使用这个类。

答案 1 :(得分:3)

您是否尝试使用过List?我认为它应该有用!

希望有所帮助!

答案 2 :(得分:1)

我不熟悉你正在使用的这个集合类,但显然它不允许有多个项目。与SET集合一样。所以我猜你正在使用的Collection相当于:

Dictionary<String, Point>

但是因为你没有钥匙,所以更像是

HashSet<Point>

就像您的收藏类一样,HashSet要求所有键唯一。就像Kieren提到的那样,List会更适合你。列表允许多个条目相同。

确实如果Point是一个类,它会允许重复,因为Objec1!= Object2即使它们的值相同也是如此。

答案 3 :(得分:0)

我真的不确定这一点,但我有一种感觉,因为编译器会生成一个强大的Collections项,不需要box / unbox值类型,所以对显式值类型本身进行了键检查,产生重复键异常?

这真的只是在黑暗中拍摄的!

答案 4 :(得分:0)

什么是Collection课程。它不是.NET Framework库类。看看这个类的文档或来源,它可以解释这个问题。