2014-02-17 5 views
-2

Я видел несколько сообщений на форуме, но пока не получил определенного ответа. Я хочу проверить список веков. Я хочу, чтобы диапазоны возрастов не перекрывались. Ключевой момент - это начало и конец возраста. МОЖЕТ быть таким же числом, это не должно приводить к нахождению совпадения.Целочисленный диапазон перекрытия валидации

Любая помощь будет большим

Пример кода

namespace RangeValidation 
{ 
    public class RangeValidate 
    { 
     private readonly IList<Age> _listOfRanges = new List<Age>(); 
     private readonly IList<Age> _secondListOfRanges = new List<Age>(); 
    public void Validate() 
    { 
     _listOfRanges.Add(new Age { BeginingAge = 20, EndingAge = 20 }); 
     _listOfRanges.Add(new Age { BeginingAge = 21, EndingAge = 30 }); 
     _listOfRanges.Add(new Age { BeginingAge = 31, EndingAge = 60 }); 


     _secondListOfRanges.Add(new Age { BeginingAge = 20, EndingAge = 20 }); 
     _secondListOfRanges.Add(new Age { BeginingAge = 20, EndingAge = 30 }); 

     _secondListOfRanges.Add(new Age { BeginingAge = 31, EndingAge = 60 }); 

     Debug.Write(Overlaps(_listOfRanges).ToString()); // NO OVERLAPS 
     Debug.Write(Overlaps(_secondListOfRanges).ToString()); // Has overlaps 

    } 

    private static bool Overlaps(IEnumerable<Age> listOfRanges) 
    { 
     return true; // needs implementation here 
    } 
} 

public class Age 
{ 
    public int BeginingAge 
    { 
     get; 
     set; 
    } 

    public int EndingAge 
    { 
     get; 
     set; 
    } 
} 

}

+3

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

+1

Хотя у вас есть код показывая ваши настройки/требования, вы не пытались написать код. Пожалуйста, сделайте попытку, а затем покажите нам, где у вас проблемы. – Harrison

ответ

3

Этот код должен работать для вас:

private static bool Overlaps(IEnumerable<Age> listOfRanges) 
{ 
    bool isOverlaps = false; 

    foreach (var range in listOfRanges) 
    { 
     if (listOfRanges.Count(x => 
      (x.BeginingAge >= range.BeginingAge && x.BeginingAge <= range.EndingAge) 
      || (x.EndingAge >= range.BeginingAge && x.EndingAge <= range.EndingAge)) > 1) 
     { 
      isOverlaps = true; 
      break; 
     } 
    } 

    return isOverlaps; 
} 

Но, как сказал Харрисон, было бы хорошо чтобы попытаться написать этот код самостоятельно. Может быть, там будет лучшее решение, чем мин, но оно работает.

0

O(n log n) решение:

private static bool Overlaps(IEnumerable<Age> listOfRanges) 
{ 
    List<Age> sorted = listOfRanges.OrderBy(o=>o.BeginingAge).ToList(); 
    for(int i=1; i<sorted.Count; ++i) 
    { 
     if(sorted[i-1].EndingAge > sorted[i].BeginingAge) //change to >= is needed 
      return false; 
    } 
    return true; 
} 
Смежные вопросы