gpt4 book ai didi

c# - 使用 Linq 构建图形类;你能让这段代码看起来更好吗?

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

我正在创建一个不可变的简单图形类(它不需要支持循环或多边)。每个节点由一个整数值表示,从 0 到 numNodes。

此代码有效,但我认为 Linq 查询和 for 循环相当难看。你能想出一个更清晰的方法来填充 _edges 吗?

public class Graph {
private IList<IList<int>> _edges;
public int Nodes { get; private set;
}

public Graph(int numNodes, IList<Tuple<int,int>> edges) {
Nodes = numNodes;
_edges = new List<IList<int>>();

for(int i = 0; i < numNodes; i++) {
_edges.Add(new List<int>(
(from e in edges where e.Item1 == i
select e.Item2).Union(
(from e in edges where e.Item2 == i
select e.Item1).Distinct())));
}
}

public IEnumerable<int> Neighbors(int node) {
return _edges[node];
}
}

最佳答案

像这样的事情怎么样:

public class Graph2
{
private IList<HashSet<int>> _edges;

public int Nodes { get; private set; }

public Graph2(int numNodes, IList<Tuple<int, int>> edges)
{
Nodes = numNodes;
_edges = new List<HashSet<int>>(numNodes);
for (int i = 0; i < numNodes; i++)
{
_edges.Add(new HashSet<int>());
}

foreach (var edge in edges)
{
_edges[edge.Item1].Add(edge.Item2);
_edges[edge.Item2].Add(edge.Item1);
}
}

public IEnumerable<int> Neighbors(int node)
{
return _edges[node];
}
}

使用 HashSet 意味着您无需担心重复项或复杂的 Linq 表达式。您也只循环遍历边缘一次。

不幸的是,您仍然有初始的 for 循环来创建空的 HashSet。

关于c# - 使用 Linq 构建图形类;你能让这段代码看起来更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4295412/

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