2013-10-03 2 views
1

Если у меня есть следующие методы:Как переопределить GetHashCode, когда дата соответствует, если плюс или минус семь дней

public bool Equals(VehicleClaim x, VehicleClaim y) 
{   
    bool isDateMatching = this.IsDateRangeMatching(x.ClaimDate, y.ClaimDate); 
    // other properties use exact matching 
} 

private bool IsDateRangeMatching(DateTime x, DateTime y) 
{  
    return x >= y.AddDays(-7) && x <= y.AddDays(7);   
} 

Я комфортно наиважнейшая GetHashcode, когда значения в точности совпадают, но я действительно понятия не имею, как это сделать это когда совпадение находится в пределах такого диапазона.

Помогите пожалуйста?

+2

Я бы исключил дату из хэша. –

+0

Это не даст мне неточные результаты? – davy

+0

Можете ли вы уточнить? Вы хотите, чтобы объекты VehicleClaim имели все свойства, за исключением дат того же самого, и даты в пределах 7 дней имели одинаковый хеш? – ElDog

ответ

2

Я согласен с Крисом, что

Но если у вас есть DATE1, как Oct1, Date2 как Oct6, Date3 как Oct12. Date1 == Date2 и Date2 == Date3, но Date1! = Date3 - странное поведение, а цель Equals - не то, что вы должны использовать.

Я действительно не знаю, если вы разрабатываете что-то новое, и если у вас есть база данных, содержащая ваши претензии к транспортному средству, но я бы связал претензии в базе данных как родительские отношения с дочерью. Что вы должны спросить себя: возможно ли, что 2 заявки на автомобиль в пределах вашего диапазона дат могут быть разными? Есть ли другое свойство, которое вы можете использовать для идентификации претензии как уникального?

Может быть, вы могли бы решить вашу проблему так:

Имея собственность

List<VehicleClaim> RelatedClaims 

в вашем объекте VehicleClaim.

Вместо Равных, использовать функцию

bool IsRelated(VehicleClaim vehiculeClaim) 
{ 
    if(all properties except date are equals) 
    { 
    // since claims are sorted by date, we could compare only with the last element 
    foreach(var c in RelatedClaims){ 
     if (IsDateRangeMatching(this.ClaimDate, c.ClaimDate)) 
      return true; 
    } 
    } 

    return false; 
} 

и добавить код, чтобы построить ваш объект

List<VehiculeClaim> yourListWithDuplicatesSortedByDate; 
List<VehiculeClaim> noDuplicateList = new List<VehiculeClaim>(); 
foreach(var cwd in yourListWithDuplicatesSortedByDate) 
{ 
    var relatedFound = noDuplicateList.FirstOrDefault(e => e.IsRelated(cwd)); 

    if (relatedFound != null) 
    relatedFound.RelatedClaims.Add(cwd); 
    else 
    noDuplicateList.Add(cwd); 
} 

Проблема с этим, ваши претензии должны быть отсортированы по дате, и это не может быть наиболее эффективный способ добиться этого.

+0

спасибо за усилия, которые вошли в этот ответ. К сожалению, это странное, но реальное требование, которое я поставил под сомнение. Есть точка, к которой я не буду вас беспокоить. К сожалению, я придерживаюсь дизайна БД. – davy

0

Имейте в виду:

Если переопределить метод GetHashCode, вы должны также переопределить Равно, и наоборот. Если ваш переопределенный метод Equals возвращает true , когда два объекта проверяются на равенство, ваш переопределенный метод GetHashCode должен возвращать одно и то же значение для двух объектов.

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

Поэтому кажется ваш GetHashCode перенастройка должна возвращать одинаковое значение для всех экземпляров, потому что каждый + - 7-дневный период перекрывает его сосед.

Не указывайте это как ответ. Это ответ, но не ответ.

 Смежные вопросы

  • Нет связанных вопросов^_^