2016-08-18 1 views
0

Ich habe eine Klasse:Finding Änderungen in einer Liste speichern dann bestimmte Werte in ein Array C#

namespace XMLParserAverage11 
{ 
    public class cPoint 
    { 
     public string point; 
     public string time; 
     public double xPoint; 
     public double yPoint; 
     public double StdDevX; 
     public double StdDevY; 
     public string csv; 

     public cPoint(string n, double x, double y) 
     { 
      this.point = n; 
      xPoint = x; 
      yPoint = y; 
     } 

} 
} 

Dies dient zum Speichern von Informationen aus dem Lesen eine XML-Datei erhalten und dann wird es in

setzt
List<cPoint> Sorted 

Was ich tun möchte ist, speichern Sie die "xPoint" in ein Array und die "YPoint" in ein anderes Array für alle "Punkt" that has the same value. Dies ist so, dass ich schließlich Statistics.PopulationStandardDeviation() aus dem Mathnet.Numerics NuGet-Paket verwenden kann, das ein doppeltes Array benötigt, und die gesamte Standardabweichung von xPoint und yPoint pro "Punkt" in List Sorted berechnet.

if (measurementType == "Body") 
{ 
    double a = Convert.ToDouble(xOffset); 
    double b = Convert.ToDouble(yOffset); 
    cPoint Point = new cPoint(location, a, b); 
    Point.time = endTime; 
    // Point.point = location; 
    // Point.xPoint = Convert.ToDouble(xOffset); 
    // Point.yPoint = Convert.ToDouble(yOffset); 
    sorted.Sort((x, y) => x.point.CompareTo(y.point)); 
    // double[] balanceX = {Point.xPoint}; 
    // double[] balanceY = {Point.yPoint}; 
    if (sixSig == true) 
    { 
     List<cPoint> pointList = new List<cPoint>(); 
     // Select all the distinct names 
     List<string> pointNames = location.Select(x => xOffset).Distinct().ToList(); 

     foreach (var name in pointNames) 
     { 

      // Get all Values Where the name is equal to the name in List; Select all xPoint Values 
      double[] x_array = pointList.Where(n => n.point == name).Select(x => x.xPoint).ToArray(); 
      Point.StdDevX = Statistics.StandardDeviation(x_array); 

      // Get all Values Where the name is equal to the name in List; Select all yPoint Values 
      double[] y_array = pointList.Where(n => n.point == name).Select(x => x.yPoint).ToArray(); 
      Point.StdDevY = Statistics.StandardDeviation(y_array); 
     } 

     csvString = Point.time + "," + Point.point + "," + Point.xPoint + "," + Point.yPoint + "," + Point.StdDevX + "," + Point.StdDevY; 
     Point.csv = csvString; 
     sorted.Add(Point); 

    } 
    else 
    { 
     csvString = endTime + "," + location + "," + xOffset + "," + yOffset; 
     Point.csv = csvString; 
     sorted.Add(Point); 
    } 
} 

Meine Ausgabe wird schließlich this ähneln.
Offensichtlich bin ich ein Anfänger, also würde jede Hilfe sehr geschätzt werden.

+0

Ihr Code ist ein wenig confusing.where ist 'sorted' bevölkert? , in der letzten Zeile? Berechnen Sie die 'PopulationStandardDeviation' mit nur 1 Wert? Warum erwarten Sie in der foreach-Schleife zwei verschiedene Ergebnisse für 'a' und' b', wenn Sie denselben Wert von 'balanceX' verwenden? –

+0

das klingt wie ein XY-Problem – Neil

+0

@Mong Zhu gibt es etwa 500 zusätzliche Zeilen Code, die ich nicht posten wollte, aber 'sortierte' wird als' cPoint' Liste in einer anderen Klasse initialisiert. Alles wird anfangs in "cPoint Point" gespeichert und dann zu "sorted" hinzugefügt, wenn alle Berechnungen usw. durchgeführt sind. –

Antwort

0

EDIT:

ok Hier ist eine kleine Konsolenanwendung, die das Verfahren veranschaulicht, die Sie suchen sind für glaube ich. Ich abgeholzt (und umbenannt) Klasse cPoint zu diesem Zweck:

public class C_Point 
{ 
    public string point; 
    public double xPoint; 
    public double yPoint; 

    public C_Point(string n, double x, double y) 
    { 
     this.point = n; 
     xPoint = x; 
     yPoint = y; 
    } 
} 

class Program 
{ 


    static void Main(string[] args) 
    { 
     List<C_Point> pointList = new List<C_Point>(); 

     pointList.Add(new C_Point("P1", 1, 11)); 
     pointList.Add(new C_Point("P1", 2, 22)); 
     pointList.Add(new C_Point("P1", 3, 33)); 
     pointList.Add(new C_Point("P10", 101, 111)); 
     pointList.Add(new C_Point("P10", 201, 211)); 
     pointList.Add(new C_Point("P10", 301, 311)); 

     // Select all the distinct names 
     List<string> pointNames = pointList.Select(x => x.point).Distinct().ToList(); 

     foreach (var name in pointNames) 
     { 
      Console.WriteLine("Name: {0}", name); 

      // Get all Values Where the name is equal to the name in List; Select all xPoint Values 
      double[] x_array = pointList.Where(n => n.point == name).Select(x => x.xPoint).ToArray(); 

      Console.WriteLine(String.Join(" ", x_array)); 

      // Get all Values Where the name is equal to the name in List; Select all yPoint Values 
      double[] y_array = pointList.Where(n => n.point == name).Select(x => x.yPoint).ToArray(); 

      Console.WriteLine(String.Join(" ", y_array)); 
     } 
     Console.ReadKey(); 
    } 
} 

Sie können es einfach kopieren einfügen in einer Konsole Projekt und laufen lassen. Es zeigt die Array-Werte mit dem Namen des Punktes an, in Ihrem Fall Location. Ist ich Ihrem Problem näher gekommen?

EDIT 2:

, wenn Sie versuchen, alle verschiedene Namen Ihrer Punkte Sie sie von der List extrahieren müssen, wo alle Punkte sind.

Hier versuchen Sie, etwas aus einem string auszuwählen, wie es scheint. Dies wird nicht funktionieren.

// Select all the distinct names 
List<string> pointNames = location.Select(x => xOffset).Distinct().ToList(); 

Verwenden Sie stattdessen die sorted Liste. Ich denke, du hast sie alle da drin, oder? Select(x=>x.point) bedeutet: Die x ist ein Platzhalter für jedes Element (in Ihrem Fall von Typ cPoint) in Ihrer Liste. Nach dem => geben Sie an, welche Eigenschaft der Elemente ausgewählt werden soll! in diesem Fall x.point. Das Ergebnis wird eine Liste aller Werte dieser Eigenschaft aller Elemente sein. Der Anruf Distinct wird die Mehrfacheinträge los.

Dieses: (x => xOffset) funktioniert nicht, weil es kein gültiger Ausdruck ist und weil Sie keine Eigenschaft Offset haben, die in der Klasse ausgewählt werden könnten cPoint

Das wird nicht funktionieren entweder:

double[] x_array = pointList.Where(n => n.point == name).Select(x => x.xPoint).ToArray(); 

weil Ihre pointList ist leer! Sie müssen wieder die List mit all Ihren Punkten verwenden!

Hoffe das hilft dir weiter. Schreib mir wenn nicht.

Für weitere Informationen lesen Sie bitte mehr über Lambda expressions

+0

'Sortiert' ist ein Bündel von Daten, die ich aus einer XML-Datei gelesen habe. Alle 'xPoint'- und' yPoint'-Werte sind immer eindeutig, aber 'point' nicht. Der Code sollte ein 'double [] x_array' und' double [] y_array' für jeden neuen 'Punkt' in 'sorted' erzeugen oder einfach zum bestehenden Array hinzufügen, wenn 'point' bereits irgendwo in' sorted' enthalten ist. Hoffentlich löscht das etwas von der Verwirrung? Danke für die Hilfe –

+0

Ich habe meine ursprüngliche Frage mit einem Bild aktualisiert, das meine mögliche Ausgabe zeigt. Hoffentlich wird dies die Dinge klären. –

+0

@ChristopherDyer ok Ich denke ich habe dich ein bisschen besser verstanden. Ich habe meine Antwort bearbeitet. Schau mal –

Verwandte Themen