一组(x,y)点的C#数据结构

一组(x,y)点的C#数据结构,c#,math,collections,relation,C#,Math,Collections,Relation,我不熟悉C#中所有可用的集合,但我想实现一个类来存储数学关系或函数,即一组对(x,y)。大概它会包括一个元组列表或其他一些从.NET构建的集合,但我不确定什么是最好的。一些可能相关的事实: 上百万双 通常会想查找哪个y与特定的x相匹配 对于我现在知道的所有情况,x都是双重类型 可能需要将y插值到不存在的x 将要提取关系的子集,包括特定范围内x的所有对 有时会希望以xs的顺序遍历对 似乎应该根据以上内容按xs排序 您需要的可能是System.Collections.Generic.SortedLi

我不熟悉C#中所有可用的集合,但我想实现一个类来存储数学关系或函数,即一组对(x,y)。大概它会包括一个元组列表或其他一些从.NET构建的集合,但我不确定什么是最好的。一些可能相关的事实:

  • 上百万双
  • 通常会想查找哪个y与特定的x相匹配
  • 对于我现在知道的所有情况,x都是双重类型
  • 可能需要将y插值到不存在的x
  • 将要提取关系的子集,包括特定范围内x的所有对
  • 有时会希望以xs的顺序遍历对 似乎应该根据以上内容按xs排序

  • 您需要的可能是
    System.Collections.Generic.SortedList

    如果您不断删除和添加项目,a的性能可能会更好。

    似乎是执行此任务的合适工具

    我们可以定义一个
    IComparable
    元素类型,如下所示

    struct FunctionPoint : IComparable<FunctionPoint>
    {
        public double X, Y;
        public FunctionPoint(double x)
        {
            this.X = x;
            this.Y = 0;
        }
        public FunctionPoint(double x, double y)
        {
            this.X = x;
            this.Y = y;
        }
        public int CompareTo(FunctionPoint other)
        {
            return X.CompareTo(other.X);
        }
    }
    
    var function = new SortedSet<FunctionPoint>();
    
  • 可能需要将y插值到不存在的x
  • 将要提取关系的子集,包括特定范围内x的所有对
  • 是否希望按xs的顺序遍历对,有时似乎应该根据上述内容按xs排序

  • 它会不会被分类?您是需要访问很多项目还是一次只访问几个项目?你为什么需要双重精度?你真的需要如此准确的答案吗?我不太清楚你在问什么。您需要一个存储x,y值的元组的类吗?(然后使用字典/列表/您认为合适的任何其他集合)或者您是否正在寻找一种表示给定函数的方法,并且在c#中实现该函数时遇到困难(在这种情况下,存储元组是一个坏主意,但您正在寻找创建一种方法来返回给定x的y值)?对于插值数据集的其他想法(使用javascript作为语言)看到这个详细的答案,本质上实现了装箱或装箱策略:对于上面的问题,不需要显式地将其存储排序,但根据所述的用法,我猜它可能是为了提高效率?对于不同的浮点类型,答案会不同吗?我说的是double,但可能使用float或其他。谢谢,我认为只要效率合理,@Mat我的理解是,
    SortedSet
    内部使用的是红黑树,这对于这类事情来说是相当有效的。如果您不经常(或根本不经常)进行插入和删除
    SortedList
    可能更合适。
    for (int i = 0; i < 100000; i++)
    {
        var x = 2 * Math.PI * i / 1000000;
        var y = Math.Sin(x);
        function.Add(new FunctionPoint { X = x, Y = y });
    }
    
    var view = function.GetViewBetween(new FunctionPoint(x), new FunctionPoint(x));
    if (view.Count > 0)
    {
        var y = view.Min;
    }
    
    var left = function.GetViewBetween(new FunctionPoint(double.NegativeInfinity), new FunctionPoint(x)).Max;
    var right = function.GetViewBetween(new FunctionPoint(x), new FunctionPoint(double.PositiveInfinity)).Min;
    var y = LinearInterpolate(left, right, x);
    
    var view = function.GetViewBetween(new FunctionPoint(a), new FunctionPoint(b));
    
    foreach (var point in function)
    {
    }