要素キーに基づいて辞書の要素のインデックスを見つけるにはどうすればよいですか?次のコードを使用して辞書を調べています。
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ??????;
}
誰か助けてもらえますか?
要素キーに基づいて辞書の要素のインデックスを見つけるにはどうすればよいですか?次のコードを使用して辞書を調べています。
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ??????;
}
誰か助けてもらえますか?
にはインデックスの概念はありませんDictionary
。内のアイテムの順序に依存することはできませんDictionary
。OrderedDictionary
代替案になるかもしれません。
var freq = new OrderedDictionary<string, int>();
// ...
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = GetIndex(freq, entry.Key);
}
public int GetIndex(OrderedDictionary<string, object> dictionary, string key)
{
for (int index = 0; index < dictionary.Count; index++)
{
if (dictionary.Item[index] == dictionary.Item[key])
return index; // We found the item
}
return -1;
}
配列とディクショナリでは、データがメモリに格納される方法がまったく異なるため、インデックスを取得する方法はありません。
任意の型の配列を宣言すると、データが次々にメモリ セルに配置されることがわかります。したがって、インデックスはメモリアドレスのシフトです。
データをディクショナリに入れると、このアイテムに使用されるアドレスを予測できません。これは、特定の空の位置に配置されるためです。これにより、キーによる高速検索のためのバランスの取れたグラフが提供されます。したがって、インデックスを使用して辞書データを操作することはできません。
PS Linqを使用して問題を解決できると思います。
2つの拡張方法があります
キーによるインデックス
public static int IndexOf<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key)
{
int i = 0;
foreach(var pair in dictionary)
{
if(pair.Key.Equals(key))
{
return i;
}
i++;
}
return -1;
}
値によるインデックス
public static int IndexOf<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TValue value)
{
int i = 0;
foreach(var pair in dictionary)
{
if(pair.Value.Equals(value))
{
return i;
}
i++;
}
return -1;
}
たぶん、このようなものがうまくいくかもしれません:
public static int GetIndex(Dictionary<string, object> dictionary, string key)
{
for (int index = 0; index < dictionary.Count; index++)
{
if(dictionary.Skip(index).First().Key == key)
return index;
}
return -1;
}
デニス・トラウブのソリューションに基づいていますが、辞書を使用しています... (元の追加による注文者です)
古いですが、誰かが使用する可能性があります - 私は現在使用しています
public static int OrderedDictIndexOfKey(string key, OrderedDictionary oDict)
{
int i = 0;
foreach (DictionaryEntry oDictEntry in oDict)
{
if ((string)oDictEntry.Key == key) return i;
i++;
}
return -1;
}
public static object OrderedDictKeyAtIndex(int index, OrderedDictionary oDict)
{
if (index < oDict.Count && index >= 0)
{
return oDict.Cast<DictionaryEntry>().ElementAt(index).Key;
}
else
{
return null;
}
}
.NET ハッシュ テーブルのディクショナリ実装には、ハッシュ キーに基づいているため、定義されたインデックスがありません。これらのソリューションの多くは O (1) Dictionary データ構造の時間の複雑さを保持していないため、ここでの回答は非効率的で遅いことがわかりました。順序付きディクショナリには、ディクショナリと比較してパフォーマンス上の欠点がいくつかあります。
唯一の効率的な解決策は、ディクショナリの作成中にインデックスを追加することです。だからあなたは例えば持っているべきです
Dictionary<string, Tuple <int, int >>
新しいキーと値のペアを追加する場合、タプルのどこにインデックスを追加しますか。この単純なソリューションは、時間 O (1) を保持し、さらにインデックスを持つプロパティを持つことができます。