次のような単一のキーに複数の値を格納したい:
HashTable obj = new HashTable();
obj.Add("1", "test");
obj.Add("1", "Test1");
現在、これはエラーをスローします。
次のような単一のキーに複数の値を格納したい:
HashTable obj = new HashTable();
obj.Add("1", "test");
obj.Add("1", "Test1");
現在、これはエラーをスローします。
あなたをtest,test1,test2,...
テーブルに入れてから、このテーブルをキーの値としてハッシュテーブルに入れることができます。これはすべて同じになります。
たとえば、次のようにしてみてください。
List<string> list = new List<string>();
list.Add("test");
list.Add("test1");
その後:
HashTable obj = new HashTable();
obj.Add("1", list);
辞書/ハッシュテーブルで同じキーを使用することはできません。たとえば、すべてのキーにリストを使用したいと思います(VB.NET)。
Dim dic As New Dictionary(Of String, List(Of String))
Dim myValues As New List(Of String)
myValues.Add("test")
myValues.Add("Test1")
dic.Add("1", myValues)
C#:
Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();
List<string> myValues = new List<string>();
myValues.Add("test");
myValues.Add("Test1");
dic.Add("1", myValues);
私は自分のMultiDictionary
クラスを使用しています。これは a に基づいてDictionary<TKey,List<TValue>>
いますが、その上にちょっとした構文糖衣を提供します。Entry<TValue>
実装がある程度簡単であることIList<T>
public class MultiDictionary<TKey, TValue>
{
private Dictionary<TKey, List<TValue>> data = new Dictionary<TKey, List<TValue>>();
public struct Entry : IEnumerable<TValue>
{
private readonly MultiDictionary<TKey, TValue> mDictionary;
private readonly TKey mKey;
public TKey Key { get { return mKey; } }
public bool IsEmpty
{
get
{
return !mDictionary.data.ContainsKey(Key);
}
}
public void Add(TValue value)
{
List<TValue> list;
if (!mDictionary.data.TryGetValue(Key, out list))
list = new List<TValue>();
list.Add(value);
mDictionary.data[Key] = list;
}
public bool Remove(TValue value)
{
List<TValue> list;
if (!mDictionary.data.TryGetValue(Key, out list))
return false;
bool result = list.Remove(value);
if (list.Count == 0)
mDictionary.data.Remove(Key);
return result;
}
public void Clear()
{
mDictionary.data.Remove(Key);
}
internal Entry(MultiDictionary<TKey, TValue> dictionary, TKey key)
{
mDictionary = dictionary;
mKey = key;
}
public IEnumerator<TValue> GetEnumerator()
{
List<TValue> list;
if (!mDictionary.data.TryGetValue(Key, out list))
return Enumerable.Empty<TValue>().GetEnumerator();
else
return list.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public Entry this[TKey key]
{
get
{
return new Entry(this, key);
}
}
}
同じキーを2回追加しているため、エラーがスローされます。Dictionary
の代わりにを使用してみてくださいHashTable
。
Dictionary<int, IList<string>> values = new Dictionary<int, IList<string>>();
IList<string> list = new List<string>()
{
"test", "Test1"
};
values.Add(1, list);
あなたは辞書を使うことができます。
実際、今説明したことは Dictionary コレクションの理想的な使い方です。値のタイプに関係なく、キーと値のペアが含まれているはずです。値を独自のクラスにすることで、将来、必要に応じて簡単に拡張できます。
サンプルコード:
class MappedValue
{
public string SomeString { get; set; }
public bool SomeBool { get; set; }
}
Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>;
キーごとに複数の値をネイティブに格納できるルックアップを探しています。
指摘したように、一度作成したルックアップにはエントリを追加できないため、これは固定リストに対してのみ機能します。
public class LookupEntry
{
public string Key { get; set; }
public string Value { get; set; }
}
var list = new List<LookupEntry>(new LookupEntry []
{
new LookupEntry() {Key="1", Value="Car" },
new LookupEntry() {Key="1", Value="Truck"},
new LookupEntry() {Key="2", Value="Duck"}
});
var lookup = list.ToLookup(x => x.Key, x => x.Value);
var all1s = lookup["1"].ToList();
JFYI、次の方法で dic を宣言できます。
Dictionary<int, IList<string>> dic = new
{
{ 1, new List<string> { "Test1", "test1" },
{ 2, new List<string> { "Test2", "test2" }
};
リストをハッシュテーブルに保存します。
obj.Add("1",new List<string>());
(obj["1"] as List<string>).Add("test");
(obj["1"] as List<string>).Add("test1");
これはよくある手口です。
このライブラリで使用したように、2 つのハッシュテーブルを使用することをお勧めします。