簡體   English   中英

在C#中存儲一組字符串列表的有效方法

[英]Efficient way to store a set of list of string in C#

我想知道哪種是在C#中存儲一組字符串列表的最有效方法。

背景

我的目標是存儲有關“屬性”的信息,如Hold(object)Location(x,y,object) 為此,我有一個字典,將屬性名稱映射到“值集”。

例如,假設我為具有這些值的“location”屬性設置了“location”

location -> ["1","2","robot1"]
            ["2","3","robot2"]
            ["2","5","key1"]

我想執行查詢

DB["location"].Contains(["1","2","robot1"])

我不知道是否可能,但它是讓你知道我需要什么。 :)

我做了什么

我必須經常修改和訪問這些數據,所以我選擇了HashSet。 但我有兩個主要選擇:

  1. 第一種是使用HashSet<string[]> 問題是我認為HashSet找不到重復項,因為標准行為是通過引用比較數組。 出於同樣的原因,我不知道解決“檢查集合中是否包含[a,b,c]”問題的好方法。
  2. 第二種是使用類似HashSet<List<string>> 但我不需要List來存儲一組簡單的元組。 對我來說,這樣的簡單工作對我來說太過分了。

另一種方法是編寫我自己的類來存儲“參數”,但如果標准庫中存在某些內容,我不想這樣做。 :)

謝謝 :)

另一種方法是編寫我自己的類來存儲“參數”,但如果標准庫中存在某些內容,我不想這樣做。 :)

這實際上是我的偏好。 雖然編寫它有點工作,但擁有一個實際類型來保存值可以直接在類型中構建相等性,並使其使用非常明確。

在您的情況下,您可以存儲2個整數和一個字符串而不是3個字符串等。更重要的是, intstring值可以適當地命名,這反過來使您的代碼更易讀和理解。

使用HashSet和Tuple可能是一種選擇

HashSet<Tuple<int, int, string>> collections;

如果您更喜歡使用所有字符串:

HashSet<Tuple<string, string, string>> collections;

對於元組的相等性,您可能會發現此MSDN鏈接很有用。 無論您喜歡哪種形式,您都可以使用以下示例作為參考:

Tuple<string, double, int>[] scores = 
                  { Tuple.Create("Ed", 78.8, 8),
                    Tuple.Create("Abbey", 92.1, 9), 
                    Tuple.Create("Ed", 71.2, 9),
                    Tuple.Create("Sam", 91.7, 8), 
                    Tuple.Create("Ed", 71.2, 5),
                    Tuple.Create("Penelope", 82.9, 8),
                    Tuple.Create("Ed", 71.2, 9),
                    Tuple.Create("Judith", 84.3, 9) };

  // Test each tuple object for equality with every other tuple. 
  for (int ctr = 0; ctr < scores.Length; ctr++)
  {
     var currentTuple = scores[ctr];
     for (int ctr2 = ctr + 1; ctr2 < scores.Length; ctr2++)
        Console.WriteLine("{0} = {1}: {2}", currentTuple, scores[ctr2], 
                                            currentTuple.Equals(scores[ctr2]));      

     Console.WriteLine();
  }   
}

暫無
暫無

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

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