我需要一个多维数据结构,其中每个维度都是一个在设计时已知的小列表。
在我程序的不同位置,我希望能够以强类型的方式访问按不同维度“切片”的数据。
我在下面放了一些示例代码,它们适用于使用嵌套接口的 2D 示例,但我想它在 3D 或 4D 中会变得非常可怕。正如@kvb 所指出的,所需的样板代码将呈指数级增长。
有人有更好的建议吗?我的意思是,保持代码简单/简短/易于理解,同时仍然保留按照以下几行做事的能力:
Data a = new Data(...)
...
SomeMethodThatOnlyCaresAboutRedThings(a.Red) // takes a IBySize<T>
...
SomeMethodThatOnlyCaresAboutBigThings(a.Big) // takes a IByColour<T>
...
这避免了那些方法必须了解与它们无关的数据结构部分,从而使它们更容易测试。
我在这里仅使用颜色/尺寸作为示例,对于无意中误导任何人这些选择是有意义的,我深表歉意。T 可以是一个简单的数据项,如浮点数或其他一些简单的数据结构。
标记为 F# 和 C#,因为我对任何一个解决方案都很满意。
public interface IByColour<T>
{
T Green { get; }
T Red { get; }
T Blue { get; }
}
public interface IBySize<T>
{
T Small { get; }
T Big { get; }
}
internal class ByColour<T> : IByColour<T>
{
public T Green { get; private set; }
public T Red { get; private set; }
public T Blue { get; private set; }
internal ByColour(T green, T red, T blue)
{
Green = green;
Red = red;
Blue = blue;
}
}
internal class BySize<T> : IBySize<T>
{
public T Small { get; private set; }
public T Big { get; private set; }
internal BySize(T small, T big)
{
Small = small;
Big = big;
}
}
public class Data<T> : IByColour<IBySize<T>>, IBySize<IByColour<T>>
{
public IBySize<T> Green { get; private set; }
public IBySize<T> Red { get; private set; }
public IBySize<T> Blue { get; private set; }
public IByColour<T> Small { get; private set; }
public IByColour<T> Big { get; private set; }
public Data(IBySize<T> green, IBySize<T> red, IBySize<T> blue)
{
Green = green;
Red = red;
Blue = blue;
Small = new ByColour<T>(Green.Small, Red.Small, Blue.Small);
Big = new ByColour<T>(Green.Big, Red.Big, Blue.Big);
}
}
编辑:澄清我的意思是“更好”,这是我的解决方案所具有的理想属性,并解释我想如何使用它。