группа linq смежными блоками

Предположим, у меня есть следующие данные:

Статус времени
10:00 Вкл.
11:00 Выкл.
12:00 Выкл.
13:00 Выкл.
14:00 Выкл.
15:00 Вкл.
16:00 Вкл.

Как я могу группировать это, используя Linq, в нечто вроде

[Вкл., [10:00]], [Выкл., [11:00, 12:00, 13:00, 14:00]], [Вкл., [15:00, 16:00]]

Создайте расширение GroupAdjacent , например, указанное здесь .

И тогда это так просто:

 var groups = myData.GroupAdjacent(data => data.OnOffStatus); 

Вы также можете сделать это с помощью одного запроса Linq, используя переменную, чтобы отслеживать изменения, например.

 int key = 0; var query = data.Select( (n,i) => i == 0 ? new { Value = n, Key = key } : new { Value = n, Key = n.OnOffFlag == data[i - 1].OnOffFlag ? key : ++key }) .GroupBy(a => a.Key, a => a.Value); 

В основном он назначает ключ для каждого элемента, который увеличивается, когда текущий элемент не равен предыдущему элементу. Конечно, это предполагает, что ваши данные находятся в списке или массиве, иначе вам придется попробовать другой метод

Вот хардкорное решение LINQ, используя Enumerable.Zip для сравнения смежных элементов и создания непрерывного ключа:

 var adj = 0; var t = data.Zip(data.Skip(1).Concat(new TimeStatus[] { null }), (x, y) => new { x, key = (x == null || y == null || x.Status == y.Status) ? adj : adj++ } ).GroupBy(i => i.key, (k, g) => g.Select(e => ex)); 

Это можно сделать как.

  1. Итерации по коллекции.
  2. Use TakeWhile condition – текст первого элемента коллекции On или Off.
  3. Итерации над подмножеством из пункта 1 и повторением выше шага и конкатенацией строки.

Надеюсь, поможет..

Вы можете проанализировать список и назначить непрерывный ключ, например, определить class:

 public class TimeStatus { public int ContiguousKey { get; set; } public string Time { get; set; } public string Status { get; set; } } 

Вы присваиваете значения непрерывному ключу путем циклического перехода, поддерживая подсчет и определяя, когда статус меняется с «Вкл.» На «Выкл.» И т. Д., Что даст вам список:

 List timeStatuses = new List { new TimeStatus { ContiguousKey = 1, Status = "On", Time = "10:00"}, new TimeStatus { ContiguousKey = 1, Status = "On", Time = "11:00"}, new TimeStatus { ContiguousKey = 2, Status = "Off", Time = "12:00"}, new TimeStatus { ContiguousKey = 2, Status = "Off", Time = "13:00"}, new TimeStatus { ContiguousKey = 2, Status = "Off", Time = "14:00"}, new TimeStatus { ContiguousKey = 3, Status = "On", Time = "15:00"}, new TimeStatus { ContiguousKey = 3, Status = "On", Time = "16:00"} }; 

Затем, используя следующий запрос, вы можете извлечь статус и сгруппировать Times:

  var query = timeStatuses.GroupBy(t => t.ContiguousKey) .Select(g => new { Status = g.First().Status, Times = g }); 
  • LINQ с groupby и count
  • Используя Linq, чтобы получить последние N элементов коллекции?
  • Пользовательская логика сортировки в OrderBy с использованием LINQ
  • LINQ Group по нескольким полям -Syntax help
  • LINQ Выберите «Определить» с анонимными типами
  • Почему это происходит? Самый эффективный способ получения нескольких объектов с помощью первичного ключа?
  • Как проверить нули в глубоком lambda-выражении?
  • условные include в linq для объектов?
  • LINQ в .NET 2.0 Runtime
  • Как «застегнуть» или «повернуть» переменное количество списков?
  • Состав и группа LINQ по периодам времени
  • Interesting Posts

    Остановите «Дин» при нажатии Enter

    Outlook – как префикс исходного содержимого электронной почты с некоторым символом, отвечая на это письмо

    Как я могу совместно использовать папку var / www на моей эмулируемой виртуальной машине Ubuntu с ОС хостинга?

    Страtagsя загрузки страницы для драйвера Chrome (обновлено до Selenium v3.12.0)

    У указанного ребенка уже есть родитель. Сначала вы должны вызвать removeView () родителя ребенка

    C # Можно ли отображать изображения в списке?

    Уведомление о восстановлении задачи, а не конкретной деятельности?

    В обработчике событий C # почему параметр «отправитель» должен быть объектом?

    Bcdedit.exe не распознается … Win 8.1

    Изменение цвета фона выбранного элемента в ListView

    Почему Boost.Asio не поддерживает интерфейс на основе событий?

    SimpleCursorTreeAdapter и CursorLoader для ExpandableListView

    Могу ли я локализовать UIDatePicker?

    Ошибка проверки валидности ssh

    Разница между fork (), vfork (), exec () и clone ()

    Давайте будем гением компьютера.