继承C#Tuple<;T、 T>;向构造函数添加值检查时。

继承C#Tuple<;T、 T>;向构造函数添加值检查时。,c#,inheritance,tuples,C#,Inheritance,Tuples,我不知道如何更好地表达这个问题。我搜索了它,并没有找到太多的答案,无论是在堆栈溢出还是其他地方。我得到的一切都是元组类型有多糟糕,以及我应该如何不惜一切代价避免这样做 不管怎么说,我正在做的程序,本质上,是用某种图形来模拟一座房子,里面有房间。为了表示应该彼此相邻的房间(和边,或邻接),我使用了元组。然而,每次我创建元组时,我都会进行检查,以确保相同的两个房间始终处于相同的顺序。如果这是我的课 public class Adjacency : Tuple<Room, Room> {

我不知道如何更好地表达这个问题。我搜索了它,并没有找到太多的答案,无论是在堆栈溢出还是其他地方。我得到的一切都是
元组类型有多糟糕,以及我应该如何不惜一切代价避免这样做

不管怎么说,我正在做的程序,本质上,是用某种图形来模拟一座房子,里面有房间。为了表示应该彼此相邻的房间(和边,或
邻接
),我使用了
元组
。然而,每次我创建
元组时,我都会进行检查,以确保相同的两个房间始终处于相同的顺序。如果这是我的课

public class Adjacency : Tuple<Room, Room>
{ 
    public Adjacency(Room item1, Room item2)
    {
    }
}
我知道代码很乱,我对对象使用了两个ID(一个是GUID,另一个只是基于静态填充计数器),但这不是我遇到的问题

我在
House
构造器中使用
PairRooms
方法,其他两种方法由在House上运行的算法使用(洗牌房间等等)

谢谢你的帮助


PS.将
Tuple
作为
邻接
的私有属性,而不是将其作为基类,这是一种可行的替代方法吗?

您可以通过隐藏构造函数和提供创建邻接对象的静态方法来确保邻接对象的引用相等

public class Adjacency : Tuple<Room, Room>
{ 
    private static readonly List<Adjacency> identityMap = new List<Adjacency>();
    private Adjacency(Room item1, Room item2)
    {
    }

    public static Get (Room a, Room b)
    {
       // look through the identity map and return a matching value
       // if none, call the constructor
    }
}
公共类邻接:元组
{ 

私有静态只读列表。

如果所有对象都承诺使用ID(GUID或静态填充计数器)进入邻接构造函数,并且我可以假设您的ID不会更改(它们不应该更改),难道你不能根据ID的值对它们重新排序吗?Tuple是一个更方便的类,因此如果你需要一个类来对多个事物进行分组,你不必创建一个。但是如果你已经创建了类,那么从Tuple继承就没有意义了。只需向你的类添加两个属性即可。@nextren问题是我该怎么做在构造函数内部执行此操作?如果您想使用Linq,应该执行以下操作:var ordered=new List(){r1,r2};ordered=ordered.OrderBy(aRoom=>aRoom.UniqueID);Tuple.Create(ordered[0],ordered[1]);
public class Adjacency : Tuple<Room, Room>
{ 
    private static readonly List<Adjacency> identityMap = new List<Adjacency>();
    private Adjacency(Room item1, Room item2)
    {
    }

    public static Get (Room a, Room b)
    {
       // look through the identity map and return a matching value
       // if none, call the constructor
    }
}