У меня есть 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!");
}
}
}
}
Итак, как вы можете видеть здесь, на изображениях, он возвращает истину для object{string} и ложь для object{int}, даже если значения совпадают.
Что тут происходит?
Если ваши типы значений заключены в рамку, сравните их с .Equals() вместо ==.
@JonathonChase, это помогло! Спасибо! :)
@Auios На самом деле можно напрямую сравнить tr с drv.Row в вашем коде, чтобы найти строку. DataView напрямую использует DataRows из DataTable, поэтому сравнение ссылок на DataRow работает. Это происходит намного быстрее, чем сравнение фактических значений в строке ...
@NineBerry Вы правы. Я слишком усложняю. Я изменил свой код на tr.Equals (view [i] .Row); сейчас
На самом деле в этом случае лучше использовать == вместо Equals (), потому что вы действительно хотите сравнить ссылку, а не содержимое
В качестве дополнительного доказательства проблем, связанных со сравнением значений в штучной упаковке, попробуйте следующее: ReferenceEquals(10, 10), это вернет false, потому что два 10 помещены в штучную упаковку независимо и, таким образом, оказываются в куче двумя отдельными объектами, оба содержат упакованный int.
@ LasseVågsætherKarlsen Было бы быстрее использовать ReferenceEquals или == тогда?
Это не имеет значения, ReferenceEquals - это определенный, как objA == objB, и обычно он будет встроен, если вам действительно удастся его вызвать. Однако нормальный вызов ReferenceEquals для двух переменных object будет скомпилирован как инструкция ceq, точно так же, как и ==, поэтому они фактически одинаковы. Используйте то, что, по вашему мнению, наиболее подходит для вас и вашей команды, чтобы понять, что происходит. Лично я бы использовал ReferenceEquals, чтобы на 100% прояснить, что мы имеем дело со ссылками, а не со значениями, но опять же, в любом случае это одно и то же.
Обратите внимание, что если вы используете оператор == и одним из операндов является объект нет, вы можете вызвать что-то другое, кроме типа сравнения ReferenceEquals, поэтому я предпочитаю ReferenceEquals, когда мне действительно нужно эталонное сравнение.
@ LasseVågsætherKarlsen Спасибо за отличные советы! :)





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