C# объект {int} не равен объекту {int}

У меня есть DataTable, и я создал DataView из DataTable. Беру запись с DataTable (скажем, запись 5). Затем я сортирую DataView и пытаюсь найти новый индекс записи, которую я взял до сортировки DataView.

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

Мой цикл выглядит так:

int currentRecord = 2;
DataRow tr = view.Table.Rows[currentRecord];

view.Sort = "Name ASC";

foreach (DataRowView drv in view)
{
    foreach(object itemA in tr.ItemArray)
    {
        foreach (object itemB in drv.Row.ItemArray)
        {
            Console.WriteLine("{0} == {1}", itemA, itemB);
            if (itemA == itemB)
            {
                Console.WriteLine("Match!");
            }
        }
    }
}

Это мой результат: C# объект {int} не равен объекту {int}C# объект {int} не равен объекту {int}

Итак, как вы можете видеть здесь, на изображениях, он возвращает истину для object{string} и ложь для object{int}, даже если значения совпадают.

Что тут происходит?

См. Также stackoverflow.com/questions/35008317/…

NineBerry 07.06.2018 18:42

Если ваши типы значений заключены в рамку, сравните их с .Equals() вместо ==.

Jonathon Chase 07.06.2018 18:44

@JonathonChase, это помогло! Спасибо! :)

Auios 07.06.2018 18:46

@Auios На самом деле можно напрямую сравнить tr с drv.Row в вашем коде, чтобы найти строку. DataView напрямую использует DataRows из DataTable, поэтому сравнение ссылок на DataRow работает. Это происходит намного быстрее, чем сравнение фактических значений в строке ...

NineBerry 07.06.2018 19:13

@NineBerry Вы правы. Я слишком усложняю. Я изменил свой код на tr.Equals (view [i] .Row); сейчас

Auios 07.06.2018 20:03

На самом деле в этом случае лучше использовать == вместо Equals (), потому что вы действительно хотите сравнить ссылку, а не содержимое

NineBerry 07.06.2018 20:54

В качестве дополнительного доказательства проблем, связанных со сравнением значений в штучной упаковке, попробуйте следующее: ReferenceEquals(10, 10), это вернет false, потому что два 10 помещены в штучную упаковку независимо и, таким образом, оказываются в куче двумя отдельными объектами, оба содержат упакованный int.

Lasse V. Karlsen 07.06.2018 21:44

@ LasseVågsætherKarlsen Было бы быстрее использовать ReferenceEquals или == тогда?

Auios 08.06.2018 17:06

Это не имеет значения, ReferenceEquals - это определенный, как objA == objB, и обычно он будет встроен, если вам действительно удастся его вызвать. Однако нормальный вызов ReferenceEquals для двух переменных object будет скомпилирован как инструкция ceq, точно так же, как и ==, поэтому они фактически одинаковы. Используйте то, что, по вашему мнению, наиболее подходит для вас и вашей команды, чтобы понять, что происходит. Лично я бы использовал ReferenceEquals, чтобы на 100% прояснить, что мы имеем дело со ссылками, а не со значениями, но опять же, в любом случае это одно и то же.

Lasse V. Karlsen 08.06.2018 19:10

Обратите внимание, что если вы используете оператор == и одним из операндов является объект нет, вы можете вызвать что-то другое, кроме типа сравнения ReferenceEquals, поэтому я предпочитаю ReferenceEquals, когда мне действительно нужно эталонное сравнение.

Lasse V. Karlsen 08.06.2018 19:11

@ LasseVågsætherKarlsen Спасибо за отличные советы! :)

Auios 08.06.2018 20:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
52
0

Другие вопросы по теме