-2

3弦のバリエーションに対応した独特のダブルを持っています。辞書などにデータを入力して、次のようなものを呼び出して値を取得できるようにしたいと考えてい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]

ここに画像の説明を入力

編集:Joneyのコードを試す:

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();
        } 
4

2 に答える 2

0

私が理解しているように、データがあり、その中でルックアップを実行したいと考えています。その目的のためにデータベースを使用できないのはなぜですか?

しかし、本当にすべての値をハードコーディングしたい場合は、それが可能です。辞書を手動で初期化しないでください。単純化して実行時にデータを解析してください。

このようなもの。(あなたは 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;
    }
}

別の単純化として、ネストされた辞書の代わりに、カスタム クラスを辞書キーとして使用できます。Equals独自に作成するか (等値メンバとをオーバーライドする必要があることに注意してくださいGetHashCode)、または基本クラス ライブラリから何かを使用します。Tuple<string, string, string>完璧なものです。

于 2015-01-06T20:54:52.213 に答える