簡體   English   中英

在c#的哈希表中為單個鍵添加多個值?

[英]Adding more than one value to a single key in a hashtable in c#?

我正在嘗試創建一個程序來讀取具有單詞及其含義的字符串

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());
        }

在一般情況下,您可以使用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和值的每個組合。

就您的代碼而言,這是:

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)

如果它是一條熱門路徑, 那么效率會顯着提高。

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

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

現在,您將執行以下操作:

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

myDicitonary[key].Add(value);

使用Dictionary<string, List<string>>而不是Hashtable。

根據您想要實現的目標,您可以使用SortedListSortedDictionary ,您可以使用自己的IComparer初始化,從而允許重復鍵。
有關詳細信息,請查看這些Stackoverflow帖子:

C#可排序集合,允許重復鍵
是否有一個替代Dictionary / SortedList允許重復?

此解決方案的缺點是,您無法通過鍵訪問元素,但仍然可以通過索引訪問元素。

改用詞典。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM