4

「辞書」データベースがあり、特定の場所から要素を返したいと考えています。「ElementAt」関数があるのを見ましたが、うまく使えませんでした。

そのようなものが機能しないのはなぜですか?

closeHash.ElementAt<State>(i);

次のエラーが表示されます。

エラー 3 'System.Collections.Generic.Dictionary' には 'ElementAt' の定義が含まれておらず、最適な拡張メソッド オーバーロード 'System.Linq.Queryable.ElementAt(System.Linq.IQueryable, int)' に無効な引数が含まれています

また、closeHash[i] は実際の要素ではなくインデックスのみを提供するため、このコードも機能しません。

   if (closeHash.ContainsKey(i) && ((State)closeHash[i]).getH() + 
((State)closeHash[i]).getG() > checkState.getH() + checkState.getG()

Dictionary の各要素はクラス "State" であり、checkState も GetH および GetG 関数を持つ State です。I 番目の位置にある要素を取り出して、削除するだけでなく、作業したいと考えています。

前もって感謝します!

グレッグ

4

5 に答える 5

7

Remove 関数を使用して ElementAt を渡すのはどうですか?

        Dictionary<int, string> closeHash = new Dictionary<int, string>();
        closeHash.Add(47, "Hello");
        closeHash.Remove(closeHash.ElementAt(0).Key);
于 2009-12-04T13:19:07.723 に答える
6

Genericコレクションでディクショナリを使用する場合は、RemoveAt()を使用する必要はありません。ディクショナリのキー値は一意である必要があります。

//       Unique Not Unique
//          |     |   
Dictionary<int, string> alphabet = new Dictionary<int, string>();
alphabet.Add(1, "A");
//Adding this will cause an Argument Exception to be thrown
//The message will be: An item with the same key has already been added.
alphabet.Add(1, "A");

アルファベットの例からキー24のアイテムを削除したい場合、これが必要になります。

alphabet.Remove(24)

同じ値のキーが2つ存在することはないため、これは機能します。

さて、キーを知らずにアイテムを削除したい場合、それは別の話です。すべての要素を調べて、それに関連付けられているキーを見つけようとする必要があります。linqを使用します。次のようなものです。

var key = (from item in alphabet
             where item.Value == "K"
             select item.Key).FirstOrDefault();
//Checking to make sure key is not null here
...
//Now remove the key
alphabet.Remove(key)

どちらの方法でも、キー値が一意である必要があるリストからRemoveAt(index)が必要になる理由はありません。

于 2009-12-04T13:40:21.213 に答える
1

なんとかできると思いますが、ハッシュテーブル型のコレクションは通常、「順序」の概念では機能しません。Java では、Enumerator または Iterator を取得して、遭遇した n 番目の項目を削除できますが、これも意味があるとは思いません。

于 2009-12-04T13:02:54.083 に答える
0

ElementAt<> 拡張メソッドを使用するには、System.Linq を使用する必要があります。これをクラス宣言の先頭に含めます。

using System.Linq;

そして、それはうまくいくはずです。

于 2009-12-04T13:10:11.903 に答える