2016-08-18 4 views
0

J'ai une classe:changements de trouver dans une liste, puis stocker des valeurs spécifiques dans un tableau 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; 
     } 

} 
} 

Ceci est utilisé pour stocker des informations obtenues à la lecture d'un fichier XML, puis il est mis en

List<cPoint> Sorted 

Ce que je voudrais faire est de stocker le "xPoint" dans un tableau et le "yPoint" dans un autre tableau pour tous "point" that has the same value. C'est ainsi que je peux finalement utiliser Statistics.PopulationStandardDeviation() de Mathnet.Numerics NuGet qui nécessite un double tableau et calculer l'écart-type total de xPoint et yPoint par le même "point" dans List Sorted.

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); 
    } 
} 

Ma sortie finira par ressembler à this.
Évidemment, je suis un débutant donc toute aide serait grandement appréciée.

+0

Votre code est un peu confusing.where est 'sorted' peuplée? , dans la dernière ligne? Calculez-vous 'PopulationStandardDeviation' avec seulement 1 valeur? pourquoi attendez-vous dans la boucle foreach deux résultats différents pour 'a' et' b' si vous utilisez la même valeur unique de 'balanceX'? –

+0

cela ressemble à un problème XY – Neil

+0

@Mong Zhu il y a environ 500 lignes de code supplémentaires que je ne voulais pas publier mais 'trié 'est initialisé comme une liste' cPoint' dans une autre classe. Tout est stocké initialement dans 'cPoint Point', puis ajouté à' trié' quand tous les calculs sont effectués. –

Répondre

0

EDIT:

ok Voici une petite application de console qui illustre la procédure que vous recherchez Je pense. Je réduis (et changé de nom) votre classe cPoint à cet effet:

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(); 
    } 
} 

Vous pouvez simplement copier coller dans un projet de la console et le laisser tourner. Il affichera les valeurs du tableau avec le nom du point, dans votre cas le Location. Est-ce que je me suis rapproché de votre problème?

EDIT 2:

lorsque vous essayez d'obtenir tous les noms distincts de vos points, vous devez les extraire du List où tous les points sont.

Ici, vous essayez de sélectionner quelque chose d'un string comme il semble. Cela ne marchera pas.

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

Utilisez plutôt la liste sorted. Je pense que vous les avez tous là, n'est-ce pas? Select(x=>x.point) signifie: le x est un espace réservé pour n'importe quel élément (dans votre cas de type cPoint) dans votre liste. après le => vous spécifiez quelle propriété des éléments doit être sélectionnée! dans ce cas x.point. Le résultat sera une liste de toutes les valeurs de cette propriété de tous les éléments. L'appel Distinct supprime les entrées multiples.

Ce: (x => xOffset) ne fonctionne pas parce qu'il est pas une expression valide et parce que vous avez pas de propriété Offset qui pourrait être sélectionné dans votre classe cPoint

Cela ne fonctionnera pas non plus:

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

parce que votre pointList est vide! Vous devez utiliser à nouveau le List avec tous vos points!

Espérons que cela vous aide davantage. Ecris-moi sinon.

Pour plus d'informations s'il vous plaît en savoir plus sur Lambda expressions

+0

'trié' est un ensemble de données que j'ai lues à partir d'un fichier XML. Toutes les valeurs 'xPoint' et' yPoint' seront toujours uniques, mais 'point' ne le sera pas. Le code devrait créer 'double [] x_array' et' double [] y_array' pour chaque nouveau 'point' dans 'trié' ou simplement ajouter au tableau existant si 'point' est déjà contenu quelque part dans' trié'. Espérons que cela clarifie une partie de la confusion? Merci pour l'aide –

+0

J'ai mis à jour ma question originale avec une image montrant ce que mon résultat final sera. J'espère que cela clarifiera les choses. –

+0

@ChristopherDyer ok je pense que je vous ai compris un peu mieux. J'ai édité ma réponse. Jetez un oeil –