C# 表示同一数据的多个版本的最佳方法

C# 表示同一数据的多个版本的最佳方法,c#,data-representation,C#,Data Representation,我想在代码中表示一个房间(房间地图:字符串的2d数组、行数、列数)。我需要访问它的四个旋转(90、180、270、0度)。所有字段:贴图、行、列在旋转房间时更改。 我正在考虑声明四个接口IRoom90,IRoom180。。。实现所有这些功能,但我必须编写((IRoom90)myRoom).列,这看起来并不优雅 实现这种功能的正确方法是什么 编辑:我正在考虑一些可以让我访问的东西,比如myRoom.rot(90).columns一份数据副本和一个执行旋转的公共方法。冗余数据是个坏主意。您只需要一组

我想在代码中表示一个房间(房间地图:字符串的2d数组、行数、列数)。我需要访问它的四个旋转(90、180、270、0度)。所有字段:贴图、行、列在旋转房间时更改。 我正在考虑声明四个接口
IRoom90
IRoom180
。。。实现所有这些功能,但我必须编写
((IRoom90)myRoom).列
,这看起来并不优雅

实现这种功能的正确方法是什么


编辑:我正在考虑一些可以让我访问的东西,比如
myRoom.rot(90).columns

一份数据副本和一个执行旋转的公共方法。冗余数据是个坏主意。您只需要一组基于旋转量进行操作的计算。您可以为所描述的4个旋转编写4个公共方法,或者只编写一个接受参数的公共方法


您还可以为4个旋转创建枚举数据类型,并要求将其实例传递给旋转方法。这将消除方法中的参数验证。

确定。所以我提出了这个:

public class Room
    {
        public class OrientedRoom{
            Direction dir;
            Room disoriented;
            OrientedRoom(Direction dir, Room disoriented){
                this.dir = dir;
                this.disoriented = disoriented;
            }
            public int Cols{
                get{
                    if(dir==Direction.North || dir == Direction.South)
                        return disoriented.cols;
                    else
                        return disoriented.rows;
                }
            }
            public int Rows{
                get{
                    if(dir==Direction.North || dir == Direction.South)
                        return disoriented.rows;
                    else
                        return disoriented.rows;
                }
            }
            public string this[int i, int j]{
                get{
                    switch(dir){
                    case Direction.West: return disoriented.map[Cols-j-1, i];break;
                    case Direction.South:return disoriented.map[Rows-i-1, Cols-j-1];break;
                    case Direction.East: return disoriented.map[j,Rows-i-1]; break;
                    case Direction.North:return disoriented.map[i, j];break;
                    }
                }
            }
        }
        public readonly int cols;
        public readonly int rows;
        private string[,] map;
        public int score;
        public string name;

        public enum Direction{North, South, East, West};
        public OrientedRoom rot(Direction dir){
            return new OrientedRoom (dir, this);
        }

我很乐意听到任何关于如何改进的建议

请看编辑的作品。无论如何,我不明白你的第二段。你能重新措辞吗?