【问题标题】:How to create and populate a nested dictionary with three keys如何使用三个键创建和填充嵌套字典
【发布时间】:2015-01-06 19:14:12
【问题描述】:

我有一个独特的双精度对应于三个字符串的变体。我想填充字典或其他东西,以便我可以调用类似dict[key1][key2][key3] 并获取值。

我已经尝试了很多类似的东西

    Dictionary<string, Dictionary<string, double>> dict = new Dictionary<string, Dictionary<string, double>> {
        { "Foo", {"Bar", 1.2 } },
        { "Foo", {"Test", 3.4 } }
    };

这给了我语法错误和错误,例如“错误 4 命名空间不能直接包含字段或方法等成员”

    Dictionary<double, Tuple<string, string>> dict = {
          {1.23, "Blah", "Foo"}
    };

这给了我类似“错误 1 ​​只能使用数组初始化表达式来分配给数组类型。尝试使用新的表达式。”

还有

    object dict = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();

    dict["k1"] = new Dictionary<string, Dictionary<string, string>>();
    dict["k1"]["k2"] = new Dictionary<string, string>();
    dict["k1"]["k2"]["k3"] = 3.5;

这给了我语法错误和错误,例如“类、结构或接口成员声明中的错误 2 无效标记 '”k1“'”

我应该怎么做?提前致谢。

![在此处输入图片描述][1]

编辑:尝试 Jonesy 的代码:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string[] grades = { "Grade 1", "Grade 5", "Grade 8", "ASTM A325", "316 Stainless", "Monel", "Brighton Best 1960" };
        string[] sizes = { "#1", "2", "3", "4", "5", "6", "8", "10", "12", "1/4", "5/16", "3/8", "7/16", "1/2", "9/16", "5/8", "3/4", "7/8", "1", "1-1/8", "1-1/4", "1-3/8", "1-1/2" };

        var dict = new Dictionary<string, Dictionary<string, Dictionary<string, double>>>();
        dict["k1"] = new Dictionary<string, Dictionary<string, double>>();
        dict["k1"]["k2"] = new Dictionary<string, double>();
        dict["k1"]["k2"]["k3"] = 3.5;


        public Form1()
        {
            InitializeComponent();
        } 

【问题讨论】:

  • 请解释如何它不起作用。如果您什么都不告诉我们,您遇到的问题很难解决。
  • 感谢您的更新,但您显示的代码并未显示您声称的错误消息。
  • 当我使用像 Error The contextual keyword 'var' may only appear within a local variable declaration 这样的 var 时,Visual Studios 给了我错误 那也不是很理想,因为我有很多值要输入,我不想为每个值使用三行。
  • 再一次,您显示的代码并未证明该问题。请显示产生您声称的错误的实际代码。
  • 认真的吗?你没有找到任何其他数据结构吗?天哪,三层嵌套字典?那是一团糟。请考虑重新设计您的代码以使用更好的数据结构。

标签: c# dictionary nested multikey


【解决方案1】:

你的最后一次尝试很接近,你想要:

var dict = new Dictionary<string, Dictionary<string, Dictionary<string, double>>>();
dict["k1"] = new Dictionary<string, Dictionary<string, double>>();
dict["k1"]["k2"] = new Dictionary<string, double>();
dict["k1"]["k2"]["k3"] = 3.5;

你想要var 而不是object

(或Dictionary&lt;string, Dictionary&lt;string, Dictionary&lt;string, double&gt;&gt;&gt;,如果你喜欢滚动)

最后一个字符串应该是double

【讨论】:

  • 这段代码给了我一个完整的错误列表,比如Error 1 Invalid token '[' in class, struct, or interface member declarationError 14 Invalid token '"k1"' in class, struct, or interface member declarationIdentifier expected
  • 您在方法之外使用代码。把它放在一个函数中。
【解决方案2】:

据我了解,您有数据并希望在其中执行查找。为什么你不能为此目的使用一些数据库?

但如果你真的想硬编码所有值,你可以。只是不要手动初始化字典,进行简化 - 在运行时解析数据。

类似的东西。 (我想你是 c# 编程的新手,所以我创建了新的控制台应用程序并复制粘贴了所有代码以方便你使用)

public class Program
{
    // harcode all data as string
    const string RawData =
        "k11,k12,k13=3.4;" +
        "k21,k22,k23=4.42;" +
        "k31,k32,k33=5.91;" +
        "k41,k42,k43=8.14;" +
        "k51,k52,k53=4.13;" +
        "k61,k62,k63=5.4";

    static void Main(string[] args)
    {
        // create dictionary from hardcoded string
        var data = ParseData();

        // use Tuple as key for data lookup
        var value = data[Tuple.Create("k11", "k12", "k13")];

        // check, that value equals expected one
        Debug.Assert(value == 3.4);
    }

    private static IDictionary<Tuple<string, string, string>, double> ParseData()
    {
        var parsedData =
            RawData
                .Split(';')
                .Select(ParseRow)
                .ToDictionary(x => x.Item1, x => x.Item2);

        return parsedData;
    }

    private static Tuple<Tuple<string, string, string>, double> ParseRow(string row)
    {
        var parts = row.Split('=');
        var coefficients = ParseCoefficients(parts[0]);
        var value = Double.Parse(parts[1], CultureInfo.InvariantCulture);

        return Tuple.Create(coefficients, value);
    }

    private static Tuple<string, string, string> ParseCoefficients(string row)
    {
        var coeffs = row.Split(',');
        var result = Tuple.Create(coeffs[0], coeffs[1], coeffs[2]);

        return result;
    }
}

作为另一个简化,您可以使用自定义类作为字典键而不是嵌套字典。自己写(注意,它应该覆盖平等成员EqualsGetHashCode),或者使用基类库中的东西。 Tuple&lt;string, string, string&gt; 是完美的。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 2021-10-17
    • 2023-04-08
    • 2021-12-10
    • 2022-12-24
    • 2020-06-28
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多