Мне нужна многомерная структура данных, где каждое измерение представляет собой небольшой список, который известен во время разработки.
В разных местах моей программы я хотел бы иметь доступ к данным, "нарезанным" разными измерениями, строго типизированным способом.
Я привел пример кода ниже, который работает для 2D-примера, используя вложенные интерфейсы, но я предполагаю, что это будет ужасно ужасно в 3D или 4D. Как определено в @kvb, требуемый код шаблона должен экспоненциально расти.
Есть ли у кого-нибудь лучшее предложение? Под этим я подразумеваю, что код должен быть простым/коротким/легким для понимания, сохраняя при этом способность делать вещи в следующих строках:
Data a = new Data(...)
...
SomeMethodThatOnlyCaresAboutRedThings(a.Red) // takes a IBySize<T>
...
SomeMethodThatOnlyCaresAboutBigThings(a.Big) // takes a IByColour<T>
...
Это позволяет избежать того, что эти методы должны знать о части структуры данных, которые не имеют к ним отношения, что делает их более легко проверяемыми.
Я использовал цвета/размеры здесь только как пример, извинения за непреднамеренное вводящее в заблуждение любого, что эти выборы были значимыми. T может быть простым элементом данных, таким как float или какая-либо другая простая структура данных.
Отмечено как F # и С#, так как я был бы счастлив с решением в.
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);
}
}
EDIT: уточнить, что я имею в виду под "лучшим", желательным свойством, которое имеет мое решение, и объяснить, как я хотел бы его использовать.