C#中Dictionary<string,string[]>无法追加元素问题求助
问题原因与解决方案
核心问题
你遇到的问题根源有两个:
- 数组的不可变性:C#中的
string[]是固定长度的不可变数组,LINQ的Append()方法不会修改原数组,而是返回一个包含原元素和新元素的全新数组。但你的代码没有将这个新数组重新赋值回字典,所以字典里的原数组完全没变化。 - (潜在问题)如果你的
Graph类构造函数没有提前把Nodes数组中的节点添加到字典并初始化为空数组,调用graph[NodeName]会直接抛出KeyNotFoundException——不过你说结果是空数组,说明你应该已经完成了节点初始化,但这点仍需要确认。
解决方案
方案1:改用可变集合(推荐)
用List<string>代替string[],它支持直接修改集合内容,性能更优,这也是图结构存储邻接表的常规做法:
修改Graph类代码:
private Dictionary<string, List<string>> graph; // 构造函数初始化字典并添加初始节点 public Graph(string[] initialNodes) { graph = new Dictionary<string, List<string>>(); foreach (var node in initialNodes) { if (!graph.ContainsKey(node)) { graph[node] = new List<string>(); } } } public void AddEdge(string nodeName, string edgeName) { // 先检查节点是否存在,避免异常 if (graph.ContainsKey(nodeName)) { graph[nodeName].Add(edgeName); } }
Main方法调用:
string[] Nodes = { "node1", "node2", "node3" }; Graph g = new Graph(Nodes); string[][] Edges = { new[] { "node1", "node2" }, new[] { "node2", "node3" } }; foreach (var edge in Edges) { g.AddEdge(edge[0], edge[1]); }
方案2:坚持使用数组(不推荐)
如果一定要用数组,必须将Append()返回的新数组重新赋值回字典:
修改AddEdge方法:
public void AddEdge(string nodeName, string edgeName) { if (graph.ContainsKey(nodeName)) { // 将Append生成的新数组赋值回字典 graph[nodeName] = graph[nodeName].Append(edgeName).ToArray(); } }
注意:这种方式每次添加元素都会创建新数组,频繁操作时性能较差,不适合图结构的常规场景。
内容的提问来源于stack exchange,提问作者LaPepega
相关产品推荐
相关产品推荐

