raubend Was ich tun möchte, kurze Version:eine IOrderedEnumerable Graf ohne es
var source = new[]{2,4,6,1,9}.OrderBy(x=>x);
int count = source.Count; // <-- get the number of elements without performing the sort
Lange Version:
Um die Anzahl der Elemente in einem IEnumerable, es festzustellen, ist notwendig, um über alle Elemente zu iterieren. Dies könnte möglicherweise eine sehr teure Operation sein.
Wenn die IEnumerable kann ICollection gegossen werden, dann kann die Zählung schnell ohne Iteration bestimmt werden. Die LINQ Count() -Methode führt dies automatisch aus.
Die Funktion myEnumerable.OrderBy() eine IOrderedEnumerable zurückgibt. Ein IOrderedEnumerable kann natürlich nicht auf ICollection umgewandelt werden, so ruft Count() wird die ganze Sache verbrauchen.
Die Sortierung ändert jedoch nicht die Anzahl der Elemente, und ein IOrderedEnumerable muss einen Verweis auf seine Quelle behalten. Wenn also diese Quelle eine ICollection ist, sollte es möglich sein, die Zählung von IOrderedEnumerable zu ermitteln, ohne sie zu verbrauchen.
Mein Ziel ist es, eine Bibliotheksmethode zu haben, die eine IEnumerable mit n Elementen nimmt und dann zum Beispiel das Element an der Position n/2 abruft;
Ich möchte vermeiden, zweimal über die IEnumerable zweimal nur um seine Anzahl zu bekommen, aber ich möchte auch vermeiden, eine unnötige Kopie zu erstellen, wenn überhaupt möglich.
ist hier ein Skelett der Funktion I
public void DoSomething(IEnumerable<T> source)
{
int count; // What we do with the source depends on its length
if (source is ICollection)
{
count = source.Count(); // Great, we can use ICollection.Count
}
else if (source is IOrderedEnumerable)
{
// TODO: Find out whether this is based on an ICollection,
// TODO: then determine the count of that ICollection
}
else
{
// Iterating over the source may be expensive,
// to avoid iterating twice, make a copy of the source
source = source.ToList();
count = source.Count();
}
// do some stuff
}
LINQ ist leider so konstruiert, dass dies völlig unmöglich ist. – SLaks
@SLaks: Oft erweist sich "komplett unmöglich" als möglich. Ich denke, du könntest das mit Expression Tree machen, aber es ist jenseits meiner Fähigkeiten. –
Können Sie Ihre eigene Wrapper-Klasse erstellen, die die ursprüngliche Quelle enthält, und bei Bedarf auch alle Bestellungen übernehmen? – Rob