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

问题描述 投票:0回答:3

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

  1. 增加一百万双
  2. 经常想要查找哪个 y 与特定的 x 对应
  3. 对于我现在知道的所有情况,x 都是双精度类型
  4. 可能想要将 y 插值到不存在的 x
  5. 想要提取关系的子集,包括 x 在特定范围内的所有对
  6. 有时会想要按 xs 的顺序迭代对 看起来应该根据以上内容按 xs 排序?
c# math collections relation
3个回答
4
投票

SortedSet<T>
似乎是完成此任务的正确工具。

我们可以定义一个

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

然后在

SortedSet<FunctionPoint>
中使用它,如下所示。

var function = new SortedSet<FunctionPoint>();
  1. 增加一百万双
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 });
}
  1. 经常想要查找哪个 y 与特定的 x 对应
var view = function.GetViewBetween(new FunctionPoint(x), new FunctionPoint(x));
if (view.Count > 0)
{
    var y = view.Min;
}
  1. 可能想要将 y 插值到不存在的 x
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);
  1. 想要提取关系的子集,包括 x 在特定范围内的所有对
var view = function.GetViewBetween(new FunctionPoint(a), new FunctionPoint(b));
  1. 想要按 xs 的顺序迭代对,有时似乎应该根据上述内容按 xs 排序?
foreach (var point in function)
{
}

0
投票

也许

System.Collections.Generic.SortedList<double, double>
就是您所需要的?
排序列表

如果您不断删除和添加项目,SortedDictionary 可能会表现得更好。


0
投票
  1. 在 Visual Studio 中创建 WPF 项目,不要更改项目的默认名称。
  2. 设计与给定屏幕截图类似的窗口。
  3. 将窗口的标题属性更改为 Novell 服务登录
  4. 用 Canvas 替换默认的 Grid 布局控件。
  5. 将所需的控件添加到画布上。
  6. 发挥您对颜色、字体、字体大小等的想象力。请勿将颜色和字体保留为默认值。你必须改变它们。
  7. 单击登录按钮将显示消息框,其中包含用户输入的信息。
  8. 单击“重置”按钮可清除表单。
© www.soinside.com 2019 - 2024. All rights reserved.