在我的程序中的不同地方,我想要以强类型的方式访问不同维度的“切片”数据.
我把下面的一些示例代码放在了使用嵌套接口的二维示例中,但是我想象会在3D或4D中变得非常可怕.如@kvb所示,所需的样板代码将呈指数增长.
有没有人有更好的建议?我的意思是,保持代码需要简单/简短/容易理解,同时仍然保留以下行为的能力:
Data a = new Data(...)...SomeMethodThatOnlyCaresAboutRedThings(a.Red) // takes a IBySize<T>...SomeMethodThatOnlyCaresAboutBigThings(a.Big) // takes a IByColour<T>...@H_419_9@这避免了这些方法必须知道数据结构与它们无关的部分,从而使它们更易于测试.
我以纯粹的颜色/大小为例,道歉,无意中误导了任何人这些选择是有意义的. 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); }}@H_419_9@编辑:澄清我的意思是“更好”,我的解决方案所需要的属性,并解释我想如何使用它.
解决方法 这听起来好像使用了一种很好的老式Datatable.然后,您可以使用linq切片和骰子,而您想要的,并且由选择的列的不同组合创建的任何唯一类型由编译器自动生成. Datatable中的所有列都是强类型的,对它们的查询结果也是如此.此外,Datatable中的DataColumn可以有任何类型,包括复杂对象或您自己的枚举类型.如果你想坚持一个更多的情绪/不变/ F#的做事方式,你可以使用一个数组或元组列表,类型1,类型2,类型N>,这与Datatable基本上是一样的.
如果你给出了更多的建模背景,我可以提供一个例子.我不知道你发布的代码是否应该代表衣服,图像(RGB颜色空间)或完全不同的东西.
[一小时后]嗯,没有OP的更新,所以我继续一个例子,我使用List< Tuple< x,y,..n>>并假定物品是服装物品.
// Some enumspublic enum Size { Small,Medium,Large }public enum color { Red,Green,Blue,Purple,brown }public enum Segment { Men,Women,Boys,Girls,Infants }// Fetches the actual List of items,where the object// item is the actual shirt,sock,shoe or whatever objectstatic List<Tuple<Size,color,Segment,object>> GetAllitems() { return new List<Tuple<Size,object>> { Tuple.Create(Size.Small,color.Red,Segment.Boys,(object)new { name="I'm a sock! Just one sock." }),Tuple.Create(Size.Large,color.Blue,Segment.Infants,(object)new { name="Baby hat,so cute." }),color.Green,Segment.Women,(object)new { name="High heels. In GREEN." }),};}static voID test() { var allitems = GetAllitems(); // Lazy (non-materialized) deFinition of a "slice" of everything that's Small var small@R_419_5962@ = allitems.Where(x => x.Item1 == Size.Small); // Lazy map where the key is the size and the value is // an IEnumerable of all items that are of that size var sizeLookup = allitems.Tolookup(x => x.Item1,x => x); // Materialize the map as a dictionary the key is the size and the // value is a List of all items that are of that size var sizeMap = sizeLookup.ToDictionary(x => x.Key,x => x.ToList()); // Proof: foreach (var size in sizeMap.Keys) { var List = sizeMap[size]; Console.Writeline("Size {0}:",size); foreach (var item in List) { Console.Writeline(" Item: {{ Size={0},color={1},Segment={2},value={3} }}",item.Item1,item.Item2,item.Item3,item.Item4); } }}@H_419_9@ 总结以上是内存溢出为你收集整理的c# – 有更好的方法来创建一个多维强类型的数据结构吗?全部内容,希望文章能够帮你解决c# – 有更好的方法来创建一个多维强类型的数据结构吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)