gpt4 book ai didi

c# - 继承 C# Tuple,同时向构造函数添加值检查。

转载 作者:行者123 更新时间:2023-11-30 23:26:31 25 4
gpt4 key购买 nike

我不确定如何更好地表达这个问题。我搜索了它,但没有找到太多答案,无论是在 Stack Overflow 还是其他地方。我得到的一切都是多么糟糕 Tuple type 是以及我应该如何不惜一切代价避免这样做。

无论如何,我正在开发的程序本质上是将带有房间的房屋建模为某种图形。为了表示应该彼此相邻的房间(和边缘,或 Adjacency ),我使用 Tuple<Room, Room> .但是,每次我创建那个 Tuple我检查以确保相同的两个房间始终处于相同的顺序。所以如果这是我的课

public class Adjacency : Tuple<Room, Room>
{
public Adjacency(Room item1, Room item2)
{
}
}

我需要 Adjacency(Room1, Room2);Adjacency(Room2, Room1);总是产生相同的对象。我目前正在通过检查 before 我创建 Tuple 来做到这一点使用 Tuple.Create , 但目前代码似乎有点乱,我试图通过继承 Tuple<Room, Room> 来抽象化并在构造函数中进行检查。 (但是由于基本构造函数首先执行,所以我找不到这样做的方法)。

我要简化/抽象的代码如下,所有当前都在类 House 中:

    public List<Tuple<Room, Room>> Adjacencies { get; private set; }

public void PairRooms(Room r1, Room r2)
{
if(r1.UniqueID == r2.UniqueID)
throw new InvalidOperationException("Cannot pair a room with itself.");

foreach(var pair in Adjacencies)
if((r1.UniqueID == pair.Item1.UniqueID && r2.UniqueID == pair.Item2.UniqueID)
|| (r1.UniqueID == pair.Item2.UniqueID && r2.UniqueID == pair.Item1.UniqueID))
throw new Exception("Pair already paired.");

var adjacentRooms = r1.NumericID < r2.NumericID ? Tuple.Create(r1, r2) : Tuple.Create(r2, r1);
Adjacencies.Add(adjacentRooms);
Console.WriteLine($"{r1.Name}, {r2.Name} are paired");
}

public IList<Room> GetAdjacentRooms(Room room)
{
var rooms = new List<Room>();
foreach(var pair in Adjacencies)
if(pair.Item1.UniqueID == room.UniqueID)
rooms.Add(pair.Item2);
else if(pair.Item2.UniqueID == room.UniqueID)
rooms.Add(pair.Item1);

return rooms;
}

public bool AreAdjacent(Room r1, Room r2)
{
foreach(var pair in Adjacencies)
if((r1.UniqueID == pair.Item1.UniqueID && r2.UniqueID == pair.Item2.UniqueID)
|| (r1.UniqueID == pair.Item2.UniqueID && r2.UniqueID == pair.Item1.UniqueID))
return true;

return false;
}

我知道代码很乱,我为对象使用了两个 ID(一个是 GUID,另一个只是基于静态人口计数器),但这不是我遇到问题的部分。

我正在使用 PairRooms遍及House的方法constructor,另外两种方法被在房子上运行的算法使用(来随机播放房间等等。)

感谢您的帮助。

附言。 Tuple<Room, Room> 会是一个可行的替代方案吗? Adjacency的私有(private)属性(property)而不是作为基类?

最佳答案

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

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
}
}

如果你还实现了IEquatable<Adjacency>这变得更加容易。如果您关心并发性,请使用 ConcurrentDictionary<TKey,Adjacency>用于标识映射。

PS 我在我的系统中使用图表来表示此类信息(以及更多信息)here .

关于c# - 继承 C# Tuple<T, T>,同时向构造函数添加值检查。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36876199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com