Ich möchte collection
auf Artikel partitionieren, die bestimmte Bedingung erfüllt. Ich kann das mit TakeWhile
und SkipWhile
, die recht einfach zu verstehen:zu partitionieren Sammlung
public static bool IsNotSeparator(int value) => value != 3;
var collection = new [] { 1, 2, 3, 4, 5 };
var part1 = collection.TakeWhile(IsNotSeparator);
var part2 = collection.SkipWhile(IsNotSeparator);
Aber dies von Anfang collection
zweimal durchlaufen würde und wenn IsNotSeparator
dauert lange könnte es Performance-Problem sein.
schnellen Weg wäre, etwas zu verwenden, wie:
var part1 = new List<int>();
var index = 0;
for (var max = collection.Length; index < max; ++index) {
if (IsNotSeparator(collection[i]))
part1.Add(collection[i]);
else
break;
}
var part2 = collection.Skip(index);
Aber das ist wirklich weniger besser lesbar als erstes Beispiel.
Also meine Frage ist: Was wäre die beste Lösung für die Partition collection
auf bestimmtes Element?
Was ich aber diese beiden oben zu kombinieren ist:
var collection = new [] { 1, 2, 3, 4, 5 };
var part1 = collection.TakeWhile(IsNotSeparator).ToList();
var part2 = collection.Skip(part1.Count);
Dies ist eine ziemlich eigensinnige Frage. Was ist eine "beste Lösung"? Lesbarkeit? Größe des Codes? Geschwindigkeit? Speichernutzung? – Groo
@Groo Ich würde für die Lesbarkeit gehen. Aber wenn 'IsNotSeparator' lange dauert, kann es ein Leistungsproblem sein. –
Ist die Liste sortiert? Das wäre der größte Leistungsunterschied. Wenn Sie es verallgemeinern, funktioniert es wie 'String.Aufteilen ', dann könnten Sie eine Erweiterungsmethode machen, die etwas wie 'IEnumerable> Split (diese IEnumerable Liste, Prädikat Übereinstimmung)' würde, die so viele Brocken zurückgeben würde, die mit dem angegebenen Element getrennt sind. –
Groo