Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача на проф. пригодность / 25 сообщений из 39, страница 1 из 2
25.07.2019, 14:01
    #39841396
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Что возвратит данный код?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A
{
            public int Value { get; set; }

            public static implicit operator A(int x) => new A { Value = x };

            public override bool Equals(object obj) => obj is A a && a.Value == Value;
}

Console.WriteLine(new A[] { 1, 1, 1, 2, 2 }.Distinct().Count());
...
Рейтинг: 0 / 0
25.07.2019, 14:06
    #39841404
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
pation,

Почему?
...
Рейтинг: 0 / 0
25.07.2019, 14:41
    #39841427
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
pation,
5
...
Рейтинг: 0 / 0
25.07.2019, 15:19
    #39841460
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
5, т.к. сравнение не отработает. Сомнительная проверка на проф пригодность. Столкнулся с этим относительно недавно, раньше не знал об этом.
...
Рейтинг: 0 / 0
25.07.2019, 16:04
    #39841489
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Код: c#
1.
2.
3.
4.
5.
6.
     class Comp : IEqualityComparer<A>
        {
            public bool Equals(A x, A y) => x == y || !(x == null || y == null) || x.Value == y.Value;
            public int GetHashCode(A obj) => obj == null ? 0 : obj.Value;          
        }
....Distinct(new Comp()).Count();
...
Рейтинг: 0 / 0
25.07.2019, 16:47
    #39841515
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Супер_Пав, 5? а тест запускали?
...
Рейтинг: 0 / 0
25.07.2019, 16:59
    #39841526
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
buserСупер_Пав, 5? а тест запускали?
после того,как вы спросили, запустил. 5. Как я и говорил, сравнение не вызывается, т.к. переопределено не правильно
...
Рейтинг: 0 / 0
25.07.2019, 17:17
    #39841539
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
pationpation,
Почему?
Ну да правильный ответ ужо был - пуркуа что GetHashCode(). Не зря в учебниках о том пишут.
...
Рейтинг: 0 / 0
25.07.2019, 17:32
    #39841545
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Тот же решарпер в случае, когда из пары Equals/GetHashCode переопределен только один метод, подчеркивает переопределенный метод, и настойчиво рекомендует переопределить второй, что в общем-то правильно, хотя в данном случае не вполне очевидно - Distinct использует внутренний класс Set<T>, который для обнаружения аналогичного элемента активно использует поиск во внутренних структурах на основании хэшкода. Если нашлось - дальше вызывает IEqualityComparer<TSource> (если не задан, то дефолтный), если не нашлось - Equals объекта вообще не будет вызван, считается, что он уже уникален.
...
Рейтинг: 0 / 0
25.07.2019, 18:18
    #39841568
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Что вернёт данный код?
Код: javascript
1.
[1, 2, 3, 4, 5].map(parseInt)


Почему?
...
Рейтинг: 0 / 0
25.07.2019, 18:23
    #39841572
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
skyANA,
[1, 2, 3, 4, 5].map(x=>parseInt(x,4))
...
Рейтинг: 0 / 0
25.07.2019, 21:02
    #39841647
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Сон Веры ПавловныEquals объекта вообще не будет вызван, считается, что он уже уникален.

ох, не конечно, equals всегда будет вызван
...
Рейтинг: 0 / 0
26.07.2019, 03:13
    #39841710
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
hVosttСон Веры ПавловныEquals объекта вообще не будет вызван, считается, что он уже уникален.

ох, не конечно, equals всегда будет вызван
Это легко проверяется установкой брейкпоинта в теле Equals.
...
Рейтинг: 0 / 0
26.07.2019, 08:27
    #39841729
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine(Enumerable.Range(0,5).Select(n=>new Foo()).Distinct().Count());
  }
}
class Foo
{
  public override bool Equals(object obj)=>throw new NotImplementedException();
}


Код: plaintext
5
...
Рейтинг: 0 / 0
26.07.2019, 09:54
    #39841755
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
В случае Distinct, без переданного компарера, будет вызван
Код: c#
1.
class ObjectEqualityComparer<T>.Equals(object, object)


Который сравнит ссылки.
...
Рейтинг: 0 / 0
26.07.2019, 09:58
    #39841757
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
ЕвгенийВВ случае Distinct, без переданного компарера, будет вызван
Код: c#
1.
class ObjectEqualityComparer<T>.Equals(object, object)


Который сравнит ссылки.
Он не сравнит ссылки, он вызовет obj1.Equals(obj2): https://referencesource.microsoft.com/#mscorlib/system/collections/generic/equalitycomparer.cs,250 (сравение ссылок - это ReferenceEquals).
Если Equals переопределен, то, разумеется, вызовется переопределенный метод. Но до этого не доходит.
...
Рейтинг: 0 / 0
26.07.2019, 09:59
    #39841758
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Кстати, если так
Код: c#
1.
struct A.....


То результат 2.
Ешо одын отличий клас от структур!
...
Рейтинг: 0 / 0
26.07.2019, 10:02
    #39841761
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
ЕвгенийВКстати, если так
Код: c#
1.
struct A.....


То результат 2.
Ешо одын отличий клас от структур!
Ну, у структур хэшкод вычисляется совсем не так, как у классов, это вроде бы известный факт. Особенно если у структуры нет ссылочных полей.
...
Рейтинг: 0 / 0
26.07.2019, 11:41
    #39841814
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
ЕвгенийВКстати, если так
Код: c#
1.
struct A.....



То результат 2.
Ешо одын отличий клас от структур!

Нет, то же будет 5
...
Рейтинг: 0 / 0
26.07.2019, 11:42
    #39841815
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Сон Веры ПавловныТот же решарпер в случае, когда из пары Equals/GetHashCode переопределен только один метод, подчеркивает переопределенный метод, и настойчиво рекомендует переопределить второй, что в общем-то правильно, хотя в данном случае не вполне очевидно - Distinct использует внутренний класс Set<T>, который для обнаружения аналогичного элемента активно использует поиск во внутренних структурах на основании хэшкода. Если нашлось - дальше вызывает IEqualityComparer<TSource> (если не задан, то дефолтный), если не нашлось - Equals объекта вообще не будет вызван, считается, что он уже уникален.

Решарпер для GetHashCode формирует очень сомнительный код, который в большинстве случаев работает неправильно
...
Рейтинг: 0 / 0
26.07.2019, 11:52
    #39841823
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
pationРешарпер для GetHashCode формирует очень сомнительный код, который в большинстве случаев работает неправильно
Ээмм.. ну да, обычно он его формирует как
Код: c#
1.
2.
3.
4.
public override int GetHashCode()
{
  return base.GetHashCode();
}


Я всегда считал, что это просто болванка, в которую нужно вписывать свой код.
...
Рейтинг: 0 / 0
26.07.2019, 11:58
    #39841827
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Сон Веры Павловны,

вообще-то я говорил о том, что он предлагает что вроде такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
сlass A
{
   public int Id {get;set;}
   public string Name {get;set;}
   public DateTime Date {get;set;}

   public override int GetHashCode()
   {
       unchecked
                {
                    var hashCode = Id.GetHashCode();
                    hashCode = (hashCode * 397) ^ Name.GetHashCode();
                    hashCode = (hashCode * 397) ^ Date.GetHashCode();
                    return hashCode;
                }
   }

}
...
Рейтинг: 0 / 0
26.07.2019, 12:34
    #39841843
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
pationСон Веры Павловны,

вообще-то я говорил о том, что он предлагает что вроде такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
сlass A
{
   public int Id {get;set;}
   public string Name {get;set;}
   public DateTime Date {get;set;}

   public override int GetHashCode()
   {
       unchecked
                {
                    var hashCode = Id.GetHashCode();
                    hashCode = (hashCode * 397) ^ Name.GetHashCode();
                    hashCode = (hashCode * 397) ^ Date.GetHashCode();
                    return hashCode;
                }
   }

}


Мой решарпер ни разу мне такого не предлагал. Более того, обычно вычисление хэшкода на основе неиммутабельных полей чревато очень серьёзными граблями, так что я как-то вообще удивлён.
...
Рейтинг: 0 / 0
26.07.2019, 12:48
    #39841850
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
Сон Веры ПавловныЕсли Equals переопределен, то, разумеется, вызовется переопределенный метод. Но до этого не доходит.

Да, хеш будет вычислен от ссылки.
Но опять таки, by design.
...
Рейтинг: 0 / 0
26.07.2019, 13:47
    #39841887
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на проф. пригодность
hVosttСон Веры ПавловныЕсли Equals переопределен, то, разумеется, вызовется переопределенный метод. Но до этого не доходит.

Да, хеш будет вычислен от ссылки.
Но опять таки, by design.
А вот фик там :)
Ссылка может поменяться после сборки мусора, но у одного и того объекта, на протяжении жизни хеш должен быть постоянным.
Видимо ради экономии места, для вычисления хеша, используется тоже самое поле, что и для lock.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Задача на проф. пригодность / 25 сообщений из 39, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]