【发布时间】:2021-10-24 11:11:09
【问题描述】:
我需要字典,哪个键需要是两个 guid 的 guid 顺序无关紧要。我有下面提到的两个解决方案,我想知道哪个更好,如果将来我需要添加第三个 guid 以及密钥的一部分,我应该去哪个。性能确实很重要,但如果差异不大,那么应该没问题。
第一个解决方案
var guids = guids
.OrderBy(g => g.ToString("N")) // Ordering so key always come as sorted
.ToList();
dict[Tuple.Create(guids[0], guids[1]) = "RandomObj";
第二个解决方案
public class GuidsModel
{
public GuidsModel(Guid guid1, Guid guid2)
{
Guid1= guid1;
Guid2= guid2;
}
public Guid Guid1 { get; private set; }
public Guid Guid2 { get; private set; }
}
public class GuidsModelComparer : IEqualityComparer<GuidsModel>
{
public static GuidsModelComparer Default = new GuidsModelComparer();
private static IEqualityComparer<HashSet<Guid>> _hashSetComparer = HashSet<Guid>.CreateSetComparer();
public bool Equals(GuidsModel x, GuidsModel y)
{
return _hashSetComparer.Equals(new HashSet<Guid> { x.Guid1, x.Guid2}, new HashSet<Guid> { y.Guid1, y.Guid2});
}
public int GetHashCode(GuidsModel obj)
{
if (obj == null)
return 0;
return _hashSetComparer.GetHashCode(new HashSet<Guid> { obj.Guid1, obj.Guid2});
}
// usage
var dict = new Dictionary<GuidsModel, object>(GuidsModelComparer.Default);
dict[new GuidsModel(guids[0], guids[1])] = "RandomObj";
【问题讨论】:
-
字典是使用哈希表实现的,即在基于给定键检索对象时非常快。那是你的用例吗?如果是这样,请在列表上使用字典。
-
HashSet更有意义。你没有价值,所以没有必要使用字典。创建具有两个 Guid 属性的自定义类型(或 Tuple / ValueTuple)。有一个构造函数来接受它们。第一个属性越小,第二个属性越大。 -
@41686d6564 Example
-
另一种选择,是只使用通信散列并将其存储为密钥
-
@imsmn 不,我正在使用字典,但我应该使用 Tuple
作为键或 GuidModel 作为键的字典。 tuple 的问题是 Tuple 不等于 Tuple 因此,在添加字典之前,我总是必须对 guid 进行排序。
标签: c# .net dictionary