13

次のような単一のキーに複数の値を格納したい:

HashTable obj = new HashTable();
obj.Add("1", "test");
obj.Add("1", "Test1");

現在、これはエラーをスローします。

4

11 に答える 11

8

あなたをtest,test1,test2,...テーブルに入れてから、このテーブルをキーの値としてハッシュテーブルに入れることができます。これはすべて同じになります。

たとえば、次のようにしてみてください。

List<string> list = new List<string>();
list.Add("test");
list.Add("test1"); 

その後:

HashTable obj = new HashTable();
obj.Add("1", list);
于 2010-12-29T13:47:44.547 に答える
6

辞書/ハッシュテーブルで同じキーを使用することはできません。たとえば、すべてのキーにリストを使用したいと思います(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);
于 2010-12-29T13:29:48.167 に答える
5

私は自分の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);
        }
    }
}
于 2010-12-29T13:45:38.357 に答える
1

同じキーを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);
于 2010-12-29T13:27:19.087 に答える
1

あなたは辞書を使うことができます。

実際、今説明したことは Dictionary コレクションの理想的な使い方です。値のタイプに関係なく、キーと値のペアが含まれているはずです。値を独自のクラスにすることで、将来、必要に応じて簡単に拡張できます。

サンプルコード:

class MappedValue
{
    public string SomeString { get; set; }
    public bool SomeBool { get; set; }
}

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>;
于 2010-12-29T13:26:22.803 に答える
0

キーごとに複数の値をネイティブに格納できるルックアップを探しています。

指摘したように、一度作成したルックアップにはエントリを追加できないため、これは固定リストに対してのみ機能します。

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();
于 2010-12-29T13:35:57.140 に答える
0

JFYI、次の方法で dic を宣言できます。

Dictionary<int, IList<string>> dic = new
{
    { 1, new List<string> { "Test1", "test1" },
    { 2, new List<string> { "Test2", "test2" }
};
于 2010-12-29T13:46:19.087 に答える
0

リストをハッシュテーブルに保存します。

obj.Add("1",new List<string>());
(obj["1"] as List<string>).Add("test");
(obj["1"] as List<string>).Add("test1");

これはよくある手口です。

于 2010-12-29T13:26:36.623 に答える
0

このライブラリで使用したように、2 つのハッシュテーブルを使用することをお勧めします。

于 2013-09-20T02:25:54.643 に答える