gpt4 book ai didi

C# 如何使图形对象可克隆

转载 作者:行者123 更新时间:2023-12-04 07:18:32 27 4
gpt4 key购买 nike

我有一个新手问题,我必须解决的问题,以继续推进我的 Unity 项目......这可能很容易,但我不是程序员,只是不知道如何实现我需要的东西.我检查了文档,但仍然不知道该怎么做:/
我正在使用图形类,我需要克隆图形对象。已经知道有必要编写深度克隆函数,因为我不需要引用,只需要独立对象的列表。
我需要的是:创建图表列表。更改第一个(通过添加一些边),并将其克隆到列表中的第二个位置。更改第 2 个(不更改第 1 个),并将其克隆到列表中的第 3 个位置,依此类推...
这是我的出发点:

public class Graph<T>
{
public int xMatrix;
public int yMatrix;
public int[] vertices;
public Graph() { }

public Graph(IEnumerable<T> vertices, IEnumerable<Tuple<T, T>> edges)
{
foreach (var vertex in vertices)
AddVertex(vertex);

foreach (var edge in edges)
AddEdge(edge);
}

public Dictionary<T, HashSet<T>> AdjacencyList { get; } = new Dictionary<T, HashSet<T>>();

public void AddVertex(T vertex)
{
AdjacencyList[vertex] = new HashSet<T>();
}

public void AddEdge(Tuple<T, T> edge)
{
if (AdjacencyList.ContainsKey(edge.Item1) && AdjacencyList.ContainsKey(edge.Item2))
{
AdjacencyList[edge.Item1].Add(edge.Item2);
AdjacencyList[edge.Item2].Add(edge.Item1);
}
}
}
我试过的:
public class Graph<T> :ICloneable
{
public int xMatrix;
public int yMatrix;
public int[] vertices;
public IEnumerable<int> verts;
public IEnumerable<Tuple<int, int>> edgs;

public Graph() { }

public Graph(IEnumerable<T> vertices, IEnumerable<Tuple<T, T>> edges)
{
foreach (var vertex in vertices)
AddVertex(vertex);

foreach (var edge in edges)
AddEdge(edge);
verts = (IEnumerable<int>)vertices;
edgs = (IEnumerable<Tuple<int, int>>)edges;
}

public Dictionary<T, HashSet<T>> AdjacencyList { get; set; } = new Dictionary<T, HashSet<T>>();

public void AddVertex(T vertex)
{
AdjacencyList[vertex] = new HashSet<T>();
}

public void AddEdge(Tuple<T, T> edge)
{
if (AdjacencyList.ContainsKey(edge.Item1) && AdjacencyList.ContainsKey(edge.Item2))
{
AdjacencyList[edge.Item1].Add(edge.Item2);
AdjacencyList[edge.Item2].Add(edge.Item1);
}

//this.edgs.Append<edge>;
//IEnumerable<Tuple<int, int>> newEdgs = this.edgs.Append<Tuple<edge.Item1, edge.Item2>;
//IEnumerable<Tuple<int, int>> newEdgs = this.edgs.Append<edge>;
//???
}

public object Clone()
{
IEnumerable<int> vertices = this.verts;
IEnumerable<Tuple<int, int>> edges = this.edgs;
Graph<int> other = new Graph<int>(vertices, edges);
return other;
}
}
先感谢您!

最佳答案

在大多数情况下,您的实现没有任何固有缺陷。
可能由您传递的 IEnumerables 引起的问题。
当您存储可枚举对象(例如 IEnumerable 变量内的整数数组)时,您不会复制值,而只是将地址(引用)存储到原始对象,除非该对象本身是值类型。
如果原始类型是引用类型,无论是否可变,例如数组,我们可以通过复制引用类型的内容来解决这个问题,对于数组,我们可以使用 .CopyTo(destinationArray) .
另一件可能会让您感到困扰的事情是 Tuple<>不像 ValueTuple(type,type)是不可变的引用类型。
不过,大部分都可以避免。如果您愿意修改克隆对象的方式,您可以改为复制 AdjacencyList反而。

public class Graph<T>
{
public int xMatrix;
public int yMatrix;
public int[] vertices;

public Dictionary<T, HashSet<T>> AdjacencyList => _AdjacencyList;

protected Dictionary<T, HashSet<T>> _AdjacencyList = new Dictionary<T, HashSet<T>>();

public Graph() { }

public Graph(IEnumerable<T> vertices, IEnumerable<Tuple<T, T>> edges) { }

public void AddVertex(T vertex) { }

public void AddEdge(Tuple<T, T> edge) { }

public object Clone()
{
Graph<T> newGraph = new Graph<T>()
{
yMatrix = this.yMatrix,
xMatrix = this.xMatrix,
vertices = new int[vertices.Length]
};

vertices.CopyTo(newGraph.vertices, 0);

newGraph._AdjacencyList = new Dictionary<T, HashSet<T>>(AdjacencyList.Select(x =>
{
T[] copied = new T[x.Value.Count];

x.Value.CopyTo(copied);

return new KeyValuePair<T, HashSet<T>>(x.Key, new HashSet<T>(copied));
}));

return newGraph;
}
}

关于C# 如何使图形对象可克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68642476/

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