我正在尝试用C#制作一个字典查询表。我需要将一个三元组的值解析为一个字符串。我尝试使用数组作为键,但这不起作用,我不知道还能做什么。在这一点上,我正在考虑制作一个字典的字典,但这可能看起来不是很漂亮,尽管这是我在javascript中如何做的。
发布于 2009-06-05 14:06:55
如果您使用的是.NET 4.0,请使用元组:
lookup = new Dictionary<Tuple<TypeA, TypeB, TypeC>, string>();如果没有,您可以定义一个Tuple并将其用作键。元组需要重写GetHashCode、Equals和IEquatable
struct Tuple<T, U, W> : IEquatable<Tuple<T,U,W>>
{
readonly T first;
readonly U second;
readonly W third;
public Tuple(T first, U second, W third)
{
this.first = first;
this.second = second;
this.third = third;
}
public T First { get { return first; } }
public U Second { get { return second; } }
public W Third { get { return third; } }
public override int GetHashCode()
{
return first.GetHashCode() ^ second.GetHashCode() ^ third.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return Equals((Tuple<T, U, W>)obj);
}
public bool Equals(Tuple<T, U, W> other)
{
return other.first.Equals(first) && other.second.Equals(second) && other.third.Equals(third);
}
}发布于 2018-11-15 02:21:43
如果您使用的是C# 7,则应该考虑使用值元组作为组合键。值元组通常比传统的引用元组(Tuple<T1, …>)提供更好的性能,因为值元组是值类型(结构),而不是引用类型,因此它们避免了内存分配和垃圾收集成本。此外,它们提供了更简洁、更直观的语法,如果您愿意的话,可以对它们的字段进行命名。它们还实现了字典所需的IEquatable<T>接口。
var dict = new Dictionary<(int PersonId, int LocationId, int SubjectId), string>();
dict.Add((3, 6, 9), "ABC");
dict.Add((PersonId: 4, LocationId: 9, SubjectId: 10), "XYZ");
var personIds = dict.Keys.Select(k => k.PersonId).Distinct().ToList();发布于 2009-06-05 14:16:02
如果出于某种原因,您确实希望避免创建自己的元组类或使用内置到.NET 4.0中的元组类,还有一种可能的方法;您可以将这三个键值组合到一个值中。
例如,如果这三个值是不超过64位的整数类型,则可以将它们组合到一个ulong中。
最坏的情况是,你总是可以使用一个字符串,只要你确保其中的三个部分用一些字符或序列分隔,而这些字符或序列不会出现在键的组件中,例如,你可以尝试使用三个数字:
string.Format("{0}#{1}#{2}", key1, key2, key3)显然,在这种方法中有一些组合开销,但取决于您使用它来做什么,这可能足够微不足道,不需要关心它。
https://stackoverflow.com/questions/955982
复制相似问题