Berechnen Sie Unterschied sich von vorherigen Element, das mit LINQ
Ich versuche, vorbereiten von Daten für ein Diagramm mithilfe von LINQ.
Das problem, die kann ich nicht lösen, ist, wie berechnen die Differenz zum vorherigen.
die Ergebnisse, die ich erwarte, ist
ID= 1, Date= Now, DiffToPrev= 0;
ID= 1, Date= Now+1, DiffToPrev= 3;
ID= 1, Date= Now+2, DiffToPrev= 7;
ID= 1, Date= Now+3, DiffToPrev= -6;
etc...
Können Sie mir helfen, erstellen Sie eine solche Abfrage ?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class MyObject
{
public int ID { get; set; }
public DateTime Date { get; set; }
public int Value { get; set; }
}
class Program
{
static void Main()
{
var list = new List<MyObject>
{
new MyObject {ID= 1,Date = DateTime.Now,Value = 5},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(1),Value = 8},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(2),Value = 15},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(3),Value = 9},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(4),Value = 12},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(5),Value = 25},
new MyObject {ID= 2,Date = DateTime.Now,Value = 10},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(1),Value = 7},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(2),Value = 19},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(3),Value = 12},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(4),Value = 15},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(5),Value = 18}
};
Console.WriteLine(list);
Console.ReadLine();
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer option (für LINQ to Objects) sein würde, zu erstellen Sie Ihre eigenen LINQ-Betreiber:
Dies ermöglicht Ihnen, Ihre Projektion mit nur einem einzigen Durchlauf des Quell-Sequenz, das ist immer ein bonus (mir läuft es über eine große log-Datei).
Beachten Sie, dass es Projekt eine Sequenz der Länge
n
in einer Sequenz der Längen-1
- möchten Sie vielleicht voranstellen eines "dummy" - erstes element, zum Beispiel. (Oder ändern Sie die Methode, um eine.)Hier ist ein Beispiel, wie Sie möchten, verwenden Sie:
Beachten Sie, dass dies umfasst das endgültige Ergebnis ist eine ID, mit der das erste Ergebnis der nächsten ID... möchten Sie vielleicht, um Ihre Sequenz-ID-ersten.
group x by new { x.Id, x.Color, x.Date }
ByFormer
oderByAdjacent
🙂Scan
auf der Basis der APL-scan-operator (ich habe viele Variationen). Warum machst duusing
mitIEnumerator
dass nicht implmentIDisposable
?IDisposable
, und Sie sollte immer verwenden Sie es - genau wieforeach
bedeutet implizit. Die nicht-generische version nicht.Index um Vorherige Objekt:
In C#4 können Sie die Zip-Methode, um zwei Elemente zu einem Zeitpunkt. Wie diese:
Änderung von Jon Skeet Antwort, nicht überspringen Sie den ersten Artikel:
Einige wesentliche Unterschiede... geht ein Drittel bool-parameter, um anzugeben, wenn es das erste element der enumerable. Ich wechselte auch die Reihenfolge der aktuellen/vorhergehenden Parameter.
Hier das passende Beispiel:
Noch eine andere mod auf Jon Skeet ist version (danke für deine Lösung +1). Ausgenommen hiervon ist die Rückgabe einer aufzählbaren von Tupeln.
Dies ist NICHT Rücksendung der ersten, weil es über die Rückkehr der intermediate zwischen den Elementen.
verwenden Sie es wie:
ODER
ODER (wie jon zeigt)
Pair
verwenden Sie? Ich sehe nicht ein, eine öffentliche in .Net?Tuple
. Ich habe es geändert. Vielen, vielen Dank.Weiter zu Felix Ungman ' s post oben, unten ist ein Beispiel, wie man erreichen kann, die Daten, die Sie benötigen, die Nutzung von Zip():
Im Grunde sind Sie und was führt Sie zwei Versionen der gleichen Liste, aber die erste version (die aktuelle Liste) beginnt auf dem 2. element in der Auflistung, sonst einen Unterschied würde immer unterscheiden, das gleiche element, was eine Differenz von null.
Ich hoffe, das macht Sinn,
Dave