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

时间:2013-05-24 16:23:44

标签: c# data-structures

我想知道哪种是在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来存储一组简单的元组。对我来说,这样的简单工作对我来说太过分了。
  3. 另一种方法是编写我自己的类来存储“参数”,但如果标准库中存在某些内容,我不想这样做。 :)

    谢谢:)

2 个答案:

答案 0 :(得分:3)

  

另一种方法是编写我自己的类来存储“参数”,但如果标准库中存在某些内容,我不想这样做。 :)

这实际上是我的偏好。虽然编写它有点工作,但拥有一个实际类型来保存值可以直接在类型中构建相等性,并使其使用非常明确。

在您的情况下,您可以存储2个整数和一个字符串而不是3个字符串等。更重要的是,intstring值可以正确命名,这反过来使您的代码更远更具可读性和可理解性。

答案 1 :(得分:1)

使用HashSet和Tuple可能是一个选择

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

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

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

对于元组的平等,你可能会发现this MSDN link很有用。无论您喜欢哪种形式,您都可以使用以下示例作为参考:

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