So haben wir hier einige Teilprobleme. Das erste Problem besteht darin, das Objekt in einer Sammlung mit dem höchsten Wert eine Projektion dieses Elements zurückzugeben. Max
vergleicht nur das Objekt selbst oder gibt bei einer Projektion das Ergebnis dieser Projektion zurück.
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source
, Func<TSource, TKey> selector
, IComparer<TKey> comparer = null)
{
if (comparer == null)
{
comparer = Comparer<TKey>.Default;
}
using (IEnumerator<TSource> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
throw new ArgumentException("Source was empty");
}
TSource maxItem = iterator.Current;
TKey maxValue = selector(maxItem);
while (iterator.MoveNext())
{
TKey nextValue = selector(iterator.Current);
if (comparer.Compare(nextValue, maxValue) > 0)
{
maxValue = nextValue;
maxItem = iterator.Current;
}
}
return maxItem;
}
}
So können wir viel effizienter den Index des Elements mit dem größten Wert erhalten:
var splitPoint = list.Select((index, number) => new { index, number })
.MaxBy(pair => pair.number)
.index;
Weiter, um die Sammlung teilen Sie einfach überspringen können/nehmen:
var firstHalf = list.Take(index);
var secondHalf = list.Skip(index + 1);
Es gibt eine Reihe von verschiedenen Problemen mit dem Code, den Sie haben, die hier gelöst werden.
Sie berechnen den Wert Max
für jeden einzelnen Artikel in Ihrer Abfrage item
zu bekommen, anstatt sie einmal Berechnung und dass die berechneten Wert verwenden.
Sie gehen dann, für jedes Element in der Liste, und kopieren Sie alle Elemente in eine neue Liste, zweimal, durchsuchen Sie diese Liste, um zu versuchen, die Position des maximalen Elements zu finden, und dann versuchen, zu finden die Position des aktuellen Artikels. Sie tun dann die ganze Sache zweimal. Das bedeutet, dass Sie das gesamte Array viermal für jedes Element in eine Liste kopieren, viermal pro Element in der Auflistung nach der Position des maximalen Elements suchen und die Liste linear durchsuchen, um den Index des aktuellen Elements zu finden (etwas Sie könnten in kürzester Zeit rechnen, indem Sie für jedes Element zweimal zählen. Dies wird ... schlecht skalieren, da die Anzahl der Gegenstände zunimmt.
Der Code hier findet den Index des Max-Objekts in einem einzigen Durchgang der Sammlung und erstellt dann Sequenzen, die jede Hälfte darstellen, die über die einfache Iteration hinausgehen.
Als Erstes können Sie einfach 'int item = list.Max()' verwenden. – Vache
Zweitens klingt es so, als ob Sie ['Außer '] (http://msdn.microsoft.com/en-us/library/vstudio/bb300779%28v=vs.100%29.aspx) verwenden möchten. – Default
@Default ich lese auf außer - es scheint wie es ein Element aus einer Liste entfernt - ich kann nicht sehen, wie ich das Ergebnis in zwei IEnumerable am Splitpoint teilen würde. – Johannes