Добрый вечер! Пусть есть список List, содержащий KeyValuePair, такой что:
List
Значений в _List довольно много.
Только в начале списка есть значения >2 до первой пары ("TRIGGERKEY", "TRIGGERVALUE"), которые нужно игнорировать.
Пара ("TRIGGERKEY", "TRIGGERVALUE") всегда находится перед обычной группой значений.
Между двумя соседними парами ("TRIGGERKEY", "TRIGGERVALUE") всегда есть >2 значений.
Собственно, вопрос в том, какое хорошее решение можно подобрать, для извлечения списка пар, начиная от пары ("TRIGGERKEY", "TRIGGERVALUE"), и до следующей пары ("TRIGGERKEY", "TRIGGERVALUE"), либо конца списка?
Я использовал грубо цикл, успешно, пытался применить linq выражения, но безуспешно.
Заранее огромное спасибо!
Ответ
var trimmed = _List.SkipWhile(el => !(el.Key == "TRIGGERKEY" && el.Value == "TRIGGERVALUE"));
int groupIndex = 0;
var groups = trimmed.GroupBy(el =>
{
if (el.Key == "TRIGGERKEY" && el.Value == "TRIGGERVALUE")
{
groupIndex++;
}
return groupIndex;
});
var result = groups.Select(g => g.Skip(1).ToList()).ToList();
но в этом решение целиком опирается на особенности текущей реализации GroupBy. Поэтому просто цикл - лучше.
Если задача встречается часто, и не хочется копипастить цикл, то лучше написать метод расширения вида
public static class ListExtensions
{
public static IEnumerable> SplitBy
foreach (T item in source)
{
if (shouldSplit(item))
{
yield return chunk;
chunk = new List
if (chunk.Count > 0)
{
yield return chunk;
}
}
}
и вызывать его повсюду как
var result2 = _List.SplitBy(el => el.Key == "TRIGGERKEY" && el.Value == "TRIGGERVALUE")
.Skip(1).ToList();
Комментариев нет:
Отправить комментарий