Laden...

Mehrfach TakeWhile auf IEnumerable<T>

Erstellt von rollerfreak2 vor 10 Jahren Letzter Beitrag vor 10 Jahren 631 Views
rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 10 Jahren
Mehrfach TakeWhile auf IEnumerable<T>

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...

S
417 Beiträge seit 2008
vor 10 Jahren

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);
rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 10 Jahren

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...