У меня есть список с несколькими дубликатами.Как выбрать одну запись по другой?
Row# Lineid ItemDescItemId RoadTax VehicleId Amount
1 122317 None -1 26.63 -78603 300
2 122317 None -2 17.75 -78603 200
3 122317 None -1 22.19 -78602 250
4 122317 Deli -2 17.75 -78603 200
В этом случае строка 2 является дубликатом Row 4, так как LineId, RoadTax, сумма и матч VehicleId. Однако, я хочу, чтобы держать линию с описанием пункта и исключить строку # 2. Так что мой список вывода выглядит следующим образом:
Row# Lineid ItemDesc ItemId RoadTax VehicleId Amount
1 122317 None -1 26.63 -78603 300
3 122317 None -1 22.19 -78602 250
4 122317 Deli -2 17.75 -78603 200
Я написал IEqualityComparer класс на основе, например, на сайте MSDN. Класс выглядит следующим образом:
public class RoadTaxComparer : IEqualityComparer<RoadTaxDto>
{
// Items are equal if ItemId/VehicleId/RoadTax are equal.
public bool Equals(RoadTaxDto x, RoadTaxDto y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//Check whether the products' properties are equal.
return x.VehicleId == y.VehicleId && x.ItemId == y.ItemId && x.RoadTax == y.RoadTax && x.Amount == y.Amount;
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public int GetHashCode(RoadTaxDto roadTaxDto)
{
//Check whether the object is null
if (Object.ReferenceEquals(roadTaxDto, null)) return 0;
//Get hash code for the VehicleId.
int hashVehicleId = roadTaxDto.VehicleId.GetHashCode();
//Get hash code for the ItemId field.
int hashCodeItemId = roadTaxDto.ItemId.GetHashCode();
//Calculate the hash code for the QuoteTaxDto.
return hashVehicleId^hashCodeItemId;
}
}
Структура RoadTaxDto выглядит следующим образом:
class RoadTaxDto
{
public int LineId {get;set}
public string ItemDesc {get;set;}
public int VehicleId {get;set;}
public decimal RoadTax {get;set;}
public int VehicleId {get;set;}
public decimal Amount {get;set;}
}
Я использую следующую команду для устранения дубликатов.
Когда я запускаю на нем компаратор, я не гарантирую, что строка 2 устранена. Итак, как я могу гарантировать, что если у записи есть дубликат, запись, которая говорит «Нет», всегда будет удалена из списка.
При таком подходе, я бы должны избавиться от RoadTaxComparer, но это работает. Спасибо! – abhi