Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Mehrfach TakeWhile auf IEnumerable<T>
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

Themenstarter:

Mehrfach TakeWhile auf IEnumerable<T>

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

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);
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers