Manchmal haben Sie nicht den Luxus der Indizierung, oder Sie möchten die Ergebnisse einer Linq-Abfrage umkehren oder die Quellensammlung nicht ändern. Wenn eine dieser Angaben zutrifft, kann Linq Ihnen helfen.
Eine Linq-Erweiterungsmethode, die anonyme Typen mit Linq Select verwendet, um einen Sortierschlüssel für Linq OrderByDescending bereitzustellen.
public static IEnumerable<T> Invert<T>(this IEnumerable<T> source)
{
var transform = source.Select(
(o, i) => new
{
Index = i,
Object = o
});
return transform.OrderByDescending(o => o.Index)
.Select(o => o.Object);
}
Verwendung:
var eable = new[]{ "a", "b", "c" };
foreach(var o in eable.Invert())
{
Console.WriteLine(o);
}
// "c", "b", "a"
Es heißt "Invertieren", weil es gleichbedeutend mit "Reverse" ist und die Disambiguierung mit der List Reverse-Implementierung ermöglicht.
Es ist auch möglich, bestimmte Bereiche einer Sammlung umzukehren, da Int32.MinValue und Int32.MaxValue außerhalb des Bereichs jeder Art von Sammlungsindex liegen. Wir können sie für den Bestellvorgang nutzen. Wenn ein Elementindex unter dem angegebenen Bereich liegt, wird ihm Int32.MaxValue zugewiesen, damit sich seine Reihenfolge bei Verwendung von OrderByDescending nicht ändert. Ebenso wird Elementen mit einem Index, der größer als der angegebene Bereich ist, Int32.MinValue zugewiesen, damit sie erscheinen am Ende des Bestellvorgangs. Allen Elementen innerhalb des angegebenen Bereichs wird ihr normaler Index zugewiesen und entsprechend umgekehrt.
public static IEnumerable<T> Invert<T>(this IEnumerable<T> source, int index, int count)
{
var transform = source.Select(
(o, i) => new
{
Index = i < index ? Int32.MaxValue : i >= index + count ? Int32.MinValue : i,
Object = o
});
return transform.OrderByDescending(o => o.Index)
.Select(o => o.Object);
}
Verwendung:
var eable = new[]{ "a", "b", "c", "d" };
foreach(var o in eable.Invert(1, 2))
{
Console.WriteLine(o);
}
// "a", "c", "b", "d"
Ich bin mir nicht sicher, welche Leistungseinbußen diese Linq-Implementierungen gegenüber der Verwendung einer temporären Liste zum Umschließen einer Sammlung zum Umkehren haben.
Zum Zeitpunkt des Schreibens war mir die Reverse-Implementierung von Linq nicht bekannt, aber es hat Spaß gemacht, dies herauszufinden.
https://msdn.microsoft.com/en-us/library/vstudio/bb358497(v=vs.100).aspx