【发布时间】:2012-10-19 16:11:39
【问题描述】:
我需要一个多维数据结构,其中每个维度都是一个在设计时已知的小列表。
在我的程序的不同位置,我希望能够以强类型的方式访问按不同维度“切片”的数据。
我在下面放置了一些示例代码,它们适用于使用嵌套接口的 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);
}
}
编辑:澄清我所说的“更好”是什么意思,这是我的解决方案所具有的理想属性,并说明我想如何使用它。
【问题讨论】:
-
您使用的是 .NET 4.0 吗?如果是这样,您是否考虑过只使用
Tuple? -
T的示例甚至 看起来 是什么样的?我无法想象它。 -
@Bobson,我认为
int和float是合乎逻辑的。 -
您需要解释应该根据什么标准来评估“更好”。表现?易于实施?四通八达的交通网络?运行时灵活性?有很多可能性。
-
请注意,如果您有 k 维度,那么您的方法需要类似 2k-2 个逻辑接口,以及一堆类。如果您想要相同的效果,但又不创建这么多实际类型,那么 F# 类型提供程序可能是实现类似接口的一种巧妙方法。
标签: c# data-structures f#