我不熟悉 C# 中可用的所有集合,但我想实现一个类来存储数学关系或函数,即一组 (x,y) 对。据推测,它会包含元组列表或来自 .NET 的其他一些内置集合,但我不确定什么是最好的。一些可能相关的事实:
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>();
- 增加一百万双
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 });
}
- 经常想要查找哪个 y 与特定的 x 对应
var view = function.GetViewBetween(new FunctionPoint(x), new FunctionPoint(x));
if (view.Count > 0)
{
var y = view.Min;
}
- 可能想要将 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);
- 想要提取关系的子集,包括 x 在特定范围内的所有对
var view = function.GetViewBetween(new FunctionPoint(a), new FunctionPoint(b));
- 想要按 xs 的顺序迭代对,有时似乎应该根据上述内容按 xs 排序?
foreach (var point in function)
{
}
也许
System.Collections.Generic.SortedList<double, double>
就是您所需要的?如果您不断删除和添加项目,SortedDictionary 可能会表现得更好。