You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Dictionary<string,string[]>无法追加元素问题求助

问题原因与解决方案

核心问题

你遇到的问题根源有两个:

  1. 数组的不可变性:C#中的string[]是固定长度的不可变数组,LINQ的Append()方法不会修改原数组,而是返回一个包含原元素和新元素的全新数组。但你的代码没有将这个新数组重新赋值回字典,所以字典里的原数组完全没变化。
  2. (潜在问题)如果你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:35:25