Hi zusammen,
ich stehe grad ein bisschen auf dem Schlauch. Ich glaube zwar das es out of the Box mit Linq so nicht geht aber vielleicht übersehe ich irgendwas.
Gegeben:
List:
1)Element : BaseElement
2)Element : BaseElement
3)OtherElement : BaseElement
4)Element : BaseElement
5)OtherElement : BaseElement
6)Element : BaseElement
7)Element : BaseElement
Was ich haben will ist:
IEnumerable<IEnumerable<Element>>
Wie ich das einmal bekomme ist klar:
list.SkipWhile(t => !(t is Element)).TakeWhile(x => x is Element);
Aber wie kann ich mit Hilfe von LINQ Multiple Partions machen?
Again what learned...
Also mit native Linq fällt mir nix ein, aber sowas lässt sich ja schnell basteln. So in etwa:
public static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> GetPartitions<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
var resultList = new List<List<T>>();
List<T> innerList = null;
foreach (var itm in source)
{
if (predicate(itm))
{
if (innerList == null)
{
innerList = new List<T>();
resultList.Add(innerList);
}
innerList.Add(itm);
}
else if (innerList != null)
innerList = null;
}
return resultList;
}
}
public class BaseElement
{}
public class Element : BaseElement
{}
// Verwendung:
var list = new List<BaseElement>();
list.Add(new BaseElement());
list.Add(new BaseElement());
list.Add(new Element());
list.Add(new BaseElement());
list.Add(new BaseElement());
list.Add(new Element());
list.Add(new Element());
list.Add(new BaseElement());
list.Add(new Element());
var elements = list.GetPartitions(f => f is Element);
Jo alternativ weiß ich schon wie ich das bastelt kann. Mir ging es nur um eine mögliche reine Linq Lösung.
Again what learned...