• 締切済み

C#のDictionaryについて

C#のDictionaryで、Keyの部分に配列のようなものを入れることは可能ですか? たとえば、(3.0, 4.0, 5.0)のような三つの値の組(順番も重要)をKeyに入れ、その値の組を指定することで、Valueの値を取得するということは可能でしょうか?

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

キーとして double[] といった配列を使うのであれば このディクショナリを処理するクラスにIEqualityComparerインターフェイスを継承しましょう クラス定義に public class Test : IEqualityComparer<double[]> といった宣言をします メンバー関数として bool IEqualityComparer<double[]>.Equals( double[] s, double[] d ) {   if ( s.Length != d.Length )   {     return false;   }   for( int n = 0; n < s.Length; n++ )   {     if ( s[n] != d[n] )       return false;   }   return true; } の実装と int IEqualityComparer<double[]>.GetHashCode(double[] s) {   int sum = 0;   foreach (int n in s)   {     sum += n.GetHashCode();   }   return sum; } 実装します ディクショナリ構築を Dictionaly<double[],string>myDict =   new Dictionaly<double[],string>( this ); といった具合にします ・・・   thisは他のクラスで使う場合はそのクラスのインスタンスを使用します

hokty66
質問者

お礼

なるほど、継承を使えばいいわけですね! ここまでのことは自分では思い浮かばなかったと思います。 ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Dictionary<string,string>myDict = new Dictionary<string,string>(); といった具合に構築して string ss = string.Format( "{0:0.0},{1:0.0},{2:0.0}",   arKey[0],arKey[1],arKey[2] ); myDict.Add( ss, sItem ); といった具合で登録します string sValue; string ss = string.Format( "{0:0.0},{1:0.0},{2:0.0}",   arKey[0],arKey[1],arKey[2] ); myDict.TryGetValue( ss, out sValue ); といった具合で取り出せばいいかと …

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [C#]連想配列の中に配列を入れたい

    いつもありがとうございます。 value["A"]["0"] = "a0"; value["A"]["1"] = "a1"; value["A"]["2"] = "a2"; value["B"]["0"] = "b0"; value["B"]["1"] = "b1"; .... みたいなのを作りたいと考えているのですが以下のようにやっても、できませんでした。 何が悪いのかがわかりません。 Dictionary<string, Dictionary<string, string>> value = new Dictionary<string, Dictionary<string, string>>(); value["A"]["0"] = "a0"; ← value["A"]["1"] = "a1"; value["A"]["2"] = "a2"; value["B"]["0"] = "b0"; value["B"]["1"] = "b1"; ... 実行すると、←のところで、 「指定されたキーはディレクトリ内に存在しませんでした。」 とエラーが出てしまいます。 上記のような配列を作りたい時はどのように書けばいいのでしょうか? よろしくお願いします。

  • Dictionaryについて3

    簡単に作ったソースなのですが、 以下の構文でエラーが発生します。 Dictionaryで作成したオブジェクトの束を配列として 格納させ、更にその配列を復帰値として取得し、メインルーチンにて展開させようと思っています。 以下のソースで考えられることございますか? 色々調べているのですが、述べ2日ハマっています。 ---------------------------------------------- Dim AAA,BBB(),CCC Set CCC=TEST 'CCCオブジェクトを展開し、値を画面に表示させる ’(未着手) private function TEST() Set AAA = CreateObject("Scripting.Dictionary") AAA.Add "1","111" ReDim Preserve BBB(0) Set BBB(0) = AAA Set TEST=BBB ←エラー個所 Exit Function End Function --------------------------------------------- エラー タイプ Microsoft VBScript 実行時エラー (0x800A01A8) オブジェクトがありません。

  • 連想配列からの値の取り出し

    お世話様です。 タイトルにもありますが連想配列を作成した後(以下に記述例)に その配列からキーを指定して値を取得したいと思っております。 array_keys関数だと値を指定してキーを取得するみたいで うまくいきませんでした。 何かよい方法ありませんでしょうか? //配列に格納 while (条件) {   $aParaOra += array((キー) => (値)); }

    • ベストアンサー
    • PHP
  • c# Dictionaryのサンプルコード

     こんにちは。c#初心者です。  先日、(既存のものではない) Dictionary<TKey, TValue> のサンプルコードを見ました。 その中に取得したハッシュ値をそのまま用いず、一度手を加えている箇所を見かけました。 int hashCode = hcp.GetHashCode(keySlots [cur]) | HASH_FLAG; (const int HASH_FLAG = -2147483648;)  見たところ、 HASH_FLAG は Int32 の最小値のようですが、何のためにこんな操作をするのかさっぱり分かりません。  このコードは https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/Dictionary.cs にありました。  どなたか分かる方がいらっしゃいましたら教えていただけませんか?

  • c# 要素と値

     こんにちは、c#初心者です。  細かいことなんですが、気にしだしたら止まらなくなって、遂に質問です。  配列などで、そのインデックスの位置に含まれているオブジェクトは”値”と呼ばれているところを見かけるのですが、List<T>などのコレクションでは”要素”と呼ばれているのを見かけます。  例えば、Array.IndexOfメソッドでは、XMLに「値を検索します」と書かれている上に、「T value」と値であることが明記してあります。  一方、List<T>のIndexOfメソッドでは、”要素”と書かれていて、「T item」となっています。  「配列の中身は値(value)、コレクションの中身は要素(item)と区別しているのか」と納得しかけていた矢先、Array.Exists 「指定された配列に、……”要素”が……」と配列でも要素という単語が使用されているじゃないですか!  もう訳が分かりません。確かに、値と要素なら大して意味の違いはないので読み手には問題ないですが、書き手にとってはどう使い分ければよいのかちんぷんかんぷんです。  どなたか使い分けの分かる人がいらっしゃいましたら教えていただけませんか?

  • C言語

    レジストリのキーから値を取得し、その取得した値の中フォルダのファイルの有無を調べあるなら他のフォルダにそのファイルをコピーしたいのですがわかりません。。。レジストリのオープンとキーの取得はわかるんですが。 例 ルートキーHKEY_LOCAL_MACHINE\SOFTWARE\HRPS\BPSS   値の名前 PathName キーの値 c:\program\HRPS このキーの値からc:\program\HRPS の中のファイル(file.c)をチェックし、あれば別のフォルダc:\program\fileの中にコピーしたいんです><

  • C# String型の配列が表示できません

    C# String型の配列が表示できません C#学習のため、下記サイトを参考にして、クッキーを取得してmixiのログを表示するサンプルプログラムを作成してみたのですが、 最後の取得した内容を表示するところでstring配列の値が「""」になっており、表示することができません。 foreachを使うと取得した内容を表示できるようですが、t[0]のように要素を指定して値をとりだそうとすると、なぜか配列の値が[""]になります。 これはC#特有の現象でしょうか? 参考サイト: http://www.atmarkit.co.jp/fdotnet/dotnettips/326cookie/cookie.html ソースダウンロードページ: http://www.atmarkit.co.jp/fdotnet/dotnettips/326cookie/mixilog.cs ちなみに、現在使用しているC#はVisual C# 2010です。 自分が変更した箇所は、 最後の「if (line.IndexOf("年") >= 0)」を「if (line.IndexOf("月") >= 0)」に変更したことです。

  • C#のジェネリック

    C++テンプレートの map<int , map< int , float > > a; a[1][1] = 10.0f; float val = a[1][1]; のような事をC#のジェネリックで実現することは可能でしょうか? Dictionary<int, Dictionary<int, float> > b = new Dictionary<int, Dictionary<int, float> >(); b[1][1] = 10.0f; とするとKeyNotExceptionがでます。 Dictionary<int, Dictionary<int, float> > b = new Dictionary<int, Dictionary<int, float> >(); b[1] = new Dictionary<int, float>(); b[1][1] = 10.0f; float val = b[1][1]; とすればできましたが第1キーが異なれば毎回newする必要があります。 キーをペアにする方法も試しました。 public struct Pair{ int x; int y; Pair(int _x, int _y) { x = _x; y = _y; } } Dictionary<Pair, float> c = new Dictionary<Pair, float>(); c[new Pair(1, 1)] = 10.0f; float val = c[new Pair(1, 1)]; しかしこれも無駄が多い気がします・・・ 自分なりにいろいろ試してみましたが他にスマートな方法、 あるいは意見があればお願い致します。

  • C言語の配列について質問です。

    配列の添え字に別の配列を指定するような以下の処理について 質問です。 #include <stdio.h> int main(void) {    int k = 0;    int kn = 0;    char str[256];    char key[] = "ABCD";    kn = strlen(key);    for(k=0; k<kn-1; k++) {    str[key[k]] = kn-k-1;    } } 上記についてですが、for文の中で "str[key[k]]"とありますが、 ループ処理にともなって配列str[] の添え字は、str[A], str[B], str[C] となるのでしょうか?? その場合、結果的に配列str[]の各要素にはどのような値が格納され るのでしょうか? そもそも、配列の添え字に対して別の配列を指定した場合の動きが よくわかりません。 どなたか教えて頂けますか??

  • C# 行列のデータ数

    例えば int [ , ,]data=[9999,9999,9999] という配列を作成し,この配列にデータを格納したとします. そこで,data[1,2,X]の時のXの値を前者の1と2を指定したときに取得することは 可能でしょうか. また,可能であればどのようにすればいいでしょうか?