【问题标题】:Finding changes in a list then storing specific values into an array C#在列表中查找更改,然后将特定值存储到数组 C#
【发布时间】:2016-08-18 10:14:43
【问题描述】:

我有一堂课:

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

 }
}

用于存储读取XML文件得到的信息,然后放入

List<cPoint> Sorted

我想做的是将“xPoint”存储到一个数组中,将“yPoint”存储到另一个数组中,用于所有“点”that has the same value。这样我最终可以使用 Statistics.PopulationStandardDeviation()from Mathnet.Numerics NuGet 包,它需要一个双数组,并计算 List Sorted 中每个相同“点”的 xPoint 和 yPoint 的总标准偏差。

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

我的输出最终将类似于this
显然我是一个初学者,所以任何帮助将不胜感激。

【问题讨论】:

  • 您的代码有点混乱。sorted 填充在哪里? ,在最后一行?你计算 PopulationStandardDeviation 只有 1 个值吗?如果您使用来自 balanceX 的相同单个值,为什么在 foreach 循环中期望 ab 有两个不同的结果?
  • 这听起来像是 XY 问题
  • @Mong Zhu 有大约 500 行额外的代码我不想发布,但 sorted 在另一个类中被初始化为 cPoint 列表。一切最初都存储在cPoint Point 中,然后在完成所有计算等后添加到sorted

标签: c# arrays list standard-deviation mathnet-numerics


【解决方案1】:

编辑:

好的,这是一个小型控制台应用程序,它说明了我认为您正在寻找的过程。为此,我减少(并重命名)了您的课程cPoint

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

您可以将其复制粘贴到控制台项目中并让它运行。 它将显示带有点名称的数组值,在您的情况下为Location。 我离你的问题更近了吗?

编辑 2:

当您尝试获取点的所有不同名称时,您需要从所有点所在的List 中提取它们。

在这里,您尝试从string 中选择一些东西。这行不通。

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

改为使用sorted 列表。我想你把它们都放在里面了,不是吗? Select(x=&gt;x.point) 表示:x 是列表中任何元素(在您的情况下为 cPoint 类型)的占位符。在=&gt; 之后指定应该选择元素的哪个属性!在这种情况下x.point。结果将是所有元素的此属性的所有值的列表。 Distinct 调用去掉了多个条目。

这:(x =&gt; xOffset) 不起作用,因为它不是一个有效的表达式,并且因为你没有可以在你的类 cPoint 中选择的属性 Offset

这也不起作用:

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

因为你的pointList 是空的!您需要再次使用List 来获得所有积分!

希望这可以进一步帮助您。如果没有,请写信给我。

欲了解更多信息,请阅读更多关于Lambda expressions

【讨论】:

  • sorted 是我从 XML 文件中读取的一堆数据。所有xPointyPoint 值将始终是唯一的,但point 不会。代码应该为“排序”中的每个新“点”创建一个double[] x_arraydouble[] y_array,或者如果point 已经包含在sorted 中的某个位置,则只需添加到现有数组中。希望这能消除一些困惑?感谢您的帮助
  • 我用一张图片更新了我的原始问题,显示了我的最终输出。希望这会澄清一些事情。
  • @ChristopherDyer 好的,我想我对你的理解更好了。我编辑了我的答案。看看
  • 首先,对于这么晚的回复,我深表歉意,我被取消了这个项目两周。这正是我想要的。您能否提供一些指导,将您的代码集成到我的项目中,以便将 x 和 y 值存储在双精度数组中?我正在努力为我的目的修改您的代码,因为这是我的第一个 c# 项目。谢谢。
  • @ChristopherDyer 我已经更新了我的答案,看看
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2020-08-04
  • 2023-03-14
相关资源
最近更新 更多