Странная структура C # в поведении коллекции - PullRequest
2 голосов
/ 13 июля 2010

Любые идеи о том, почему это

    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 ]

6 голосов
/ 13 июля 2010

Причина в том, что равенство типа значения основано на его значениях - для структуры это равенство во всех его полях.

Равенство ссылочного типа основано на самой ссылке и, таким образом, работает. Изменение значений структуры на все разные также работает.

Если вы просто хотите список вещей, просто используйте List<Point>, я думаю, что он будет принимать дубликаты.

Обновление: похоже, класс вашей коллекции обнаруживает повторяющиеся записи, и вы пытаетесь добавить дубликаты. Если вы хотите добавить дубликаты, я бы сказал, что вы не можете использовать этот класс.

3 голосов
/ 13 июля 2010

Вы пытались использовать список вместо? Я думаю, что это должно работать!

Надеюсь, это поможет!

1 голос
/ 13 июля 2010

Я не знаком с этим классом коллекции, который вы используете, но, очевидно, он не позволяет нескольким элементам находиться в нем.Как это с коллекцией SET.Поэтому я предполагаю, что используемая вами коллекция эквивалентна:

Dictionary<String, Point>

, но поскольку у вас нет ключа, она больше похожа на

HashSet<Point>

Так же, как для вашего класса коллекции HashSet требует все ключи должны быть уникальными .Как Кирен упоминает, список будет более подходящим для вас.Список позволяет нескольким записям быть одинаковыми.

Действительно, если бы Point был классом, он допускал бы дубликаты, начиная с Objec1! = Object2, даже если их значения одинаковы.

0 голосов
/ 13 июля 2010

Что такое Collection класс. Это не класс библиотеки .NET Framework. Посмотрите документы или источники этого класса, это объяснит проблему.

0 голосов
/ 13 июля 2010

Я действительно не уверен в этом, но у меня есть ощущение, что, поскольку компилятор генерирует сильный элемент Collections, который не требует блокировать / распаковывать типы значений, проверка ключа выполняется для самого явного типа значения, который создает исключение дубликата ключа?

Это действительно просто выстрел в темноте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...