将向量写入函数应用于 C# 中列表中的所有元素

本文关键字:列表 元素 向量 函数 应用于 | 更新日期: 2023-09-27 18:32:16

>我有一个由 4 个双列组成的列表

class MainE
{
     class cPoint
    {
        public double a;
        public double b;
        public double c;
        public double d;
    };
static void Main()
{
    List<cPoint> lst = new List<cPoint>();
    lst .Add(new cPoint(){a =613, b = 261, c=163,d=345 });
    lst .Add(new cPoint(){a =271, b = 251, c=363,d=444 });
    lst .Add(new cPoint(){a =181, b = 232, c=473,d=643 });
    lst .Add(new cPoint(){a =411, b = 322, c=643,d=742 });
    lst .Add(new cPoint(){a =542, b = 225, c=853,d=141 });
    lst .Add(new cPoint(){a =661, b = 242, c=293,d=241 });
    lst .Add(new cPoint(){a =771, b = 232, c=143,d=243 });
    lst .Add(new cPoint(){a =481, b = 212, c=353,d=444 });
    lst .Add(new cPoint(){a =681, b = 214, c=233,d=514 });
    lst .Add(new cPoint(){a =613, b = 241, c=123,d=355 });
    lst .Add(new cPoint(){a =271, b = 451, c=363,d=444 });
    lst .Add(new cPoint(){a =171, b = 232, c=463,d=743 });
    lst .Add(new cPoint(){a =419, b = 362, c=653,d=782 });
    lst .Add(new cPoint(){a =142, b = 227, c=853,d=149 });
    lst .Add(new cPoint(){a =661, b = 282, c=943,d=241 });
    lst .Add(new cPoint(){a =721, b = 282, c=444,d=343 });
    lst .Add(new cPoint(){a =482, b = 292, c=323,d=424 });
    lst .Add(new cPoint(){a =641, b = 219, c=123,d=514 });
}

}

我想使用公式从原始列表创建 2 个列表(此处为向量编写):

一个列表需要将以下公式应用于原始列表中的每列

for (i = 1; i < N - 1; ++i)
{
    output[i] = (input[i - 1] + input[i] + input[i + 1]) / 3;
}

第二个列表需要将以下公式应用于原始列表中的每列

for (i = 1; i < N ; ++i)
{
    output[i] = input[i] - input[i - 1];
}

这里的问题是我不知道如何获取列表中的上一个元素和下一个元素,以及如何从列表中的第二个元素开始并在最后一个元素之前完成......

如何将每个公式应用于原始列表中的每列?

将向量写入函数应用于 C# 中列表中的所有元素

您可以

cPoint类定义一个indexer

class cPoint {
    static cPoint(){
      //We just care about the Fields of type double
      fields = typeof(cPoint).GetFields().Where(f=>f.FieldType==typeof(double)).ToArray();
      ColumnCount = fields.Length;
    }
    static FieldInfo[] fields;
    public static int ColumnCount {get;private set;}
    public double a;
    public double b;
    public double c;
    public double d;
    public double this[int index]{
       get {
          return (double)fields[index].GetValue(this);
       }
       set {
          fields[index].SetValue(this, value);
       }
    }
}
var list1 = lst.Select(x=> {                    
                cPoint output = new cPoint();
                output[0] = x[0];
                for(int i = 1; i < x.ColumnCount-1; i++){
                   output[i] = (x[i - 1] + x[i] + x[i + 1]) / 3;
                }
                return output;
            }).ToList();
var list2 = lst.Select(x=> {
                cPoint output = new cPoint();
                output[0] = x[0];
                for(int i = 1; i < x.ColumnCount; i++){
                   output[i] = x[i] - x[i - 1];
                }
                return output;
            }).ToList();

注意:您应该定义一些internal list来按顺序公开Columns,因为以这种方式使用Reflection可能会降低性能。但是,在此处使用Reflection的好处是,您可以轻松添加或删除字段,只需按所需的顺序定义字段,定义字段的顺序正是要在 for 循环中循环的列的顺序

cPoint上放置索引器的替代方法

    class cPoint
    {
        private readonly double[] values = new double[4];
        public double this[int index] {
            get { return values[index]; }
            set { values[index] = value; }
        }
        public int Length
        {
            get { return values.Length; }
        }
        public double a
        {
            get { return this[0]; }
            set { this[0] = value; }
        }
        public double b
        {
            get { return this[1]; }
            set { this[1] = value; }
        }
        public double c
        {
            get { return this[2]; }
            set { this[2] = value; }
        }
        public double d
        {
            get { return this[3]; }
            set { this[3] = value; }
        }
    };