2013-11-25 3 views
2

Ниже мой списокгруппа непрерывных элементы и выберите первый и последний элемент

List<DateTime> ls_date =new List<DateTime>() 
ls_date.Add("2013-12-02") 
ls_date.Add("2013-12-03") 
ls_date.Add("2013-12-04") 
ls_date.Add("2013-12-05") 
ls_date.Add("2013-12-08") 
ls_date.Add("2013-12-12") 
ls_date.Add("2013-12-13") 
ls_date.Add("2013-12-14") 

Я хочу к группе непрерывной дате и выберите дату начала и окончания этой группы

Выход:

"2013-12-02"-"2013-12-05" 
"2013-12-08"-"2013-12-08" 
"2013-12-12"-"2013-12-14" 

Моя попытка:

public class sampleWithIntervals 
{ 
public DateTime startDate; 
public DateTime endDate; 
} 
    var data = ls_date 
      .Select((s, i) => new { sample = s, index = i })     
      .GroupBy(si => new { date = si.sample.Date.AddDays(-si.index) })     
      .Select(g => new sampleWithIntervals() 
      { 
       startDate = g.Min(s => s.sample.Date), 
       endDate = g.Max(s => s.sample.Date) 

      }); 

Как я могу это достичь?

+0

Вы могли бы начать с моей функции (http://codereview.stackexchange.com/questions/6512/grouping-by-sequence-in-linq) или один из ответов. – MPelletier

+0

'Список ls_date = новый Список (); ls_date.Add ("2013-12-02"); 'не будет компилироваться: строки не являются' DateTime', если они не обрабатываются. –

+0

sorry.i'm преобразование и добавление в список – balaji

ответ

3

Вот вспомогательная функция, которая группирует элементы на основе функции, которая принимает текущие и предыдущие пункты определяет, что элемент должен быть в существующей группе, или новая группа:

public static IEnumerable<IEnumerable<T>> GroupWhile<T>(
    this IEnumerable<T> source, Func<T, T, bool> predicate) 
{ 
    using (var iterator = source.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) 
      yield break; 

     List<T> list = new List<T>() { iterator.Current }; 

     T previous = iterator.Current; 

     while (iterator.MoveNext()) 
     { 
      if (predicate(previous, iterator.Current)) 
      { 
       list.Add(iterator.Current); 
      } 
      else 
      { 
       yield return list; 
       list = new List<T>() { iterator.Current }; 
      } 

      previous = iterator.Current; 
     } 
     yield return list; 
    } 
} 

Теперь вы можете написать :

var intervals = dates.GroupWhile((prev, next) => 
     prev.Date.AddDays(1) == next.Date) 
    .Select(g => new sampleWithIntervals() 
    { 
     startDate = g.Min(s => s.Date), 
     endDate = g.Max(s => s.Date) 
    }); 
+0

Я не получаю никакого списка в качестве результата – balaji

+0

@balaji Работает отлично в тесте, который я написал. Возможно, ваш набор входных данных пуст. – Servy

+0

Я определил этот статический метод внутри статического класса. Это верно? – balaji

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