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课程。它基于 aDictionary<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

你可以用字典。

实际上,您刚刚描述的是 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 回答
1

这会引发错误,因为您要添加两次相同的密钥。尝试使用 aDictionary而不是 a 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

可能是 4 年后,但我希望它对以后的人有所帮助。如前文所述,Hashtable(key, value) 中的不同值不能使用相同的键。虽然,您可以在 HashTable 的键/值对中创建一个List或某个对象作为值。

//instantiate new Hashtable
Hashtable hashtable = new Hashtable();

//create a class that would represent a value in the HashTable
public class SomeObject
{
    public string value1 { get; set;}
    public string value2 { get; set;}
}

//create a List that would store our objects
List<SomeObject> list = new List<someObject>();

//add new items to the created list
list.Add(new SomeObject() 
             { 
                 value1 = "test", 
                 value2 = "test1"
             });
list.Add(new SomeObject() 
             {
                 value1 = "secondObject_value1" 
                 value2 = "secondObject_value2"
             })

//add key/value pairs to the Hashtable.
hashTable.Add("1", list[0]);
hashTable.Add("2", list[1]);

然后检索此数据:

//retrieve the value for the key "1"
SomeObject firstObj = (SomeObject)hashTable[1];
//retrieve the value for the key "2"
SomeObject secondObj = (SomeObject)hashTable[2];
Console.WriteLine("Values of the first object are: {0} and {1}", 
                                             firstObj.value1,firstObj.value2);
Console.WriteLine("Values of the second object are {0} and {1}",
                                             secondObj.value1, secondObj.value2);
// output for the WriteLine:
Values of the first object are: test and test1
Values of the second object are secondObject_value1 and secondObject_value2
于 2014-08-08T08:45:16.020 回答
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

您正在寻找一个Lookup,它可以为每个键本机存储多个值。

正如所指出的,这仅适用于固定列表,因为一旦创建条目就无法将条目添加到查找中。

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

最好使用我在这个库中使用的两个哈希表

于 2013-09-20T02:25:54.643 回答
0

您可以使用 NameValueCollection - 与哈希表一样工作并且具有“GetValues()”。

于 2013-06-13T11:02:51.990 回答