Ich schreibe eine Funktion, die eine Reihe von System.Windows.Point übernimmt und ein ValueTuple mit den Grenzwerten X und Y für alle Punkte zurückgibt. Dies soll die Beschriftungen von Diagrammachsen bestimmen.LINQ Min/Max und Minimierung von Iterationen
Ich versuche, die Anzahl der Iterationen der Liste auf nur eine zu minimieren. Nach einiger Zeit des Googelns habe ich einen Ansatz wie unten beschrieben (gelesen: "kopiert"), von dem mir gesagt wird, dass er genau das tun wird. Aber ich bin mir nicht sicher, wie ich das bestätigen soll. Ich frage mich, wenn jemand besser vertraut mit LINQ kann
- Bestätigen Sie, dass die folgende Funktion wird in der Tat nur einmal die Liste iterieren, obwohl es 4 verschiedene Werte der Berechnung ist
- Wenn ja, mir erklären, wie das ist. Weil es für mich aussieht, als ob der anonyme Typ konstruiert wird, ruft "Min" und "Max" auf der gegebenen Liste zweimal für jeden auf. Warum führt das nicht zu 4 Iterationen?
- Vielleicht sogar erklären, wie ich für mich die Anzahl der Iterationen überprüft haben könnte, so dass ich in der Zukunft solche Fragen nicht stellen muss. Ich sehe nicht, wie ich damit umgehen soll.
Mein LINQ-Fu ist noch nicht stark.
Dank
/// <summary>
/// X and Y axis boundaries in the form of a System.ValueTuple.
/// </summary>
public (double MinX, double MaxX, double MinY, double MaxY)
GetBounds(List<System.Windows.Point> pts)
{
// Calculate the bounds with a LINQ statement. Is this one iteration or many?
var a = pts.GroupBy(i => 1).Select(
pp => new
{
MinY = pp.Min(p => p.Y),
MaxY = pp.Max(p => p.Y),
MinX = pp.Min(p => p.X),
MaxX = pp.Max(p => p.X)
}).FirstOrDefault();
return a != null ? (a.MinX, a.MaxX, a.MinY, a.MaxY) : (0, 0, 0, 0);
}
es zu überprüfen, könnten Sie implementieren Ihre eigenen 'IEnumerable', die an die Konsole schreibt, wenn iteriert. –
Blorgbeard
Gibt es einen Grund, warum Sie den Eingabeparameter nicht verwenden? Woher wissen Sie, dass die Sammlung mehrmals durchlaufen wird? –
Vor allem, meine Entschuldigung. Das "ProfilePoints" sollte der Eingabeparameter sein. Ich habe meinen Beitrag in letzter Minute bearbeitet. Es wurde jetzt behoben. Zweitens, ich weiß nicht, ob es mehrmals wiederholt wird. Das ist, was ich versuche zu bestimmen – Joe