我想知道哪种是在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。但我有两个主要选择:
HashSet<string[]>
这样的东西。问题是我认为HashSet找不到重复项,因为标准行为是通过引用比较数组。出于同样的原因,我不知道解决“检查集合中是否包含[a,b,c]”的好方法。HashSet<List<string>>
之类的东西。但我不需要List来存储一组简单的元组。对我来说,这样的简单工作对我来说太过分了。另一种方法是编写我自己的类来存储“参数”,但如果标准库中存在某些内容,我不想这样做。 :)
谢谢:)
答案 0 :(得分:3)
另一种方法是编写我自己的类来存储“参数”,但如果标准库中存在某些内容,我不想这样做。 :)
这实际上是我的偏好。虽然编写它有点工作,但拥有一个实际类型来保存值可以直接在类型中构建相等性,并使其使用非常明确。
在您的情况下,您可以存储2个整数和一个字符串而不是3个字符串等。更重要的是,int
和string
值可以正确命名,这反过来使您的代码更远更具可读性和可理解性。
答案 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();
}
}