Толи лыжи не едут, толи я ... что-то не понимаю
От: RadmirT Россия  
Дата: 19.06.08 08:28
Оценка:
Пишем код:
    class A
    {
        private int myVar;

        public int MyProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }
        public A( int var)
        {
            myVar = var;
        }
        public override bool Equals(object obj)
        {
            A instance = obj as A;
            return instance !=null?instance.MyProperty == this.MyProperty:false;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<A> ACollection = new List<A>();
            A A1 = new A(1);
            ACollection.Add(A1);
            ACollection.Add(new A(2));
            ACollection.Add(new A(3));
            A A2 = new A(1);
            ACollection.Add(A2);
            ACollection.Remove(A2);

        }
    }

После выполнения ожидается что в результирующея коллекция будет иметь вид:
A(1)
A(2)
A(3)

НО НА САМОМ ДЕЛЕ ОНА ИМЕЕТ ВИД:
A(2)
A(3)
A(1)

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Толи лыжи не едут, толи я ... что-то не понимаю
От: Ziaw Россия  
Дата: 19.06.08 08:44
Оценка:
Здравствуйте, RadmirT, Вы писали:

ничего удивительного, Remove находит первый элемент в списке который Equals параметру и убивает его.
... << RSDN@Home 1.2.0 alpha 4 rev. 1089>>
Re[2]: Толи лыжи не едут, толи я ... что-то не понимаю
От: RadmirT Россия  
Дата: 19.06.08 08:50
Оценка:
Это понятно. Но ИМХО было бы логичнее если бы объект удалялся по ссылке.
Re: Толи лыжи не едут, толи я ... что-то не понимаю
От: Овощ http://www.google.com
Дата: 19.06.08 08:51
Оценка:
Здравствуйте, RadmirT.

Просто закомментируйте переопределенный метод A.Equals и посмотрите как изменится результат.
Грубо говоря, ваш метод A.Equals сравнивает элементы by value, a когда его не будет, то сравнение будет происходить by reference.
Re: Толи лыжи не едут, толи я ... что-то не понимаю
От: divergo  
Дата: 19.06.08 09:21
Оценка:
RT> return instance !=null?instance.MyProperty == this.MyProperty:false;

A(1) — удаляется этот элемент
A(2)
A(3)
A(1)

все правильно
Re[3]: Толи лыжи не едут, толи я ... что-то не понимаю
От: dotneter  
Дата: 19.06.08 10:04
Оценка: 6 (1)
Здравствуйте, RadmirT, Вы писали:

RT>Это понятно. Но ИМХО было бы логичнее если бы объект удалялся по ссылке.

Укажи явно свое пожелание
ACollection.RemoveAll(x => object.ReferenceEquals(x, A2));
... << RSDN@Home 1.2.0 alpha rev. 789>>
Talk is cheap. Show me the code.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.