在c#的哈希表中为单个键添加多个值?

时间:2017-05-04 08:10:29

标签: c# hashtable

我试图创建一个程序来读取具有单词及其含义的字符串,例如

Book: Cover with Papers in between
Book: Reserve

每当我尝试我的代码时,我都会收到错误,因为每个密钥都必须是唯一的。有办法解决这个问题吗?

Hashtable ht = new Hashtable();
        var fileStream = new FileStream(@"e:\test.txt", FileMode.Open, FileAccess.Read);
        using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
        {

            string line;
            while ((line = streamReader.ReadLine()) != null)
            {
                ht.Add(line.Split(':')[0], line.Split(':')[1]);
            }
        }

        if (ht.ContainsKey("Book"))
        {
            listBox1.Items.Add(ht["Book"].ToString());
        }

5 个答案:

答案 0 :(得分:3)

在一般情况下,您可以使用List<string>作为值,只使用Add。但是,您可以通过ToLookup

简化LINQ
var groups = File.ReadLines(path)
            .Select(line => line.Split(':'))
            .ToLookup(x => x[0], x => x[1].Trim());

现在,您可以访问groups[key],它会为您提供具有该前缀的所有值,或者您可以foreach超过groups来获取.Key和值的每个组合。< / p>

就您的代码而言,这是:

var groups = File.ReadLines(@"e:\test.txt")
            .Select(line => line.Split(':'))
            .ToLookup(x => x[0], x => x[1].Trim());

foreach(var val in groups["Book"])
    listBox1.Items.Add(val);

(无需先检查是否存在,如果不匹配,它就能正常工作)

然而!如果您仍希望在此代码之后所有,即在其他地方使用groups,则只需执行此操作。如果你不这样做,你可以更节俭,只是放弃不需要的数据:

var values = File.ReadLines(@"e:\test.txt")
             .Where(line => line.StartsWith("Book:"))
             .Select(line => line.Substring(5).Trim());

foreach(var val in values)
    listBox1.Items.Add(val);

编辑:次要的东西 - 一个令人烦恼的方法签名意味着line.Split(':')每次都会实际创建一个数组,因为params;所以我通常使用:

static readonly char[] Colon = {':'};

line.Split(Colon)

如果它是一条热门路径,那么效率会显着提高

答案 1 :(得分:2)

使用字典,其中值是字符串列表:

var myDicitonary = new Dictionary<string, List<string>>

现在,您要执行以下操作:

if (!myDictionary.ContainsKey(key))
{
    myDicitonary.Add(key, new List<string>());
}

myDicitonary[key].Add(value);

答案 2 :(得分:0)

使用Dictionary<string, List<string>>代替Hashtable。

答案 3 :(得分:0)

根据您要实现的目标,您可以使用SortedListSortedDictionary,使用自己的IComparer进行初始化,这样可以使用重复的密钥。
有关详细信息,请查看这些Stackoverflow帖子:

C# Sortable collection which allows duplicate keys
Is there an alternative to Dictionary/SortedList that allows duplicates?

此解决方案的缺点是,您无法按键访问元素,但仍然可以通过索引访问。

答案 4 :(得分:0)

使用词典。

Dictionary<string, list<string>> dic = new Dictionary<string, list<string>();