SortedDictionary.TryGetValue() 重载
SortedDictionary.TryGetValue() Overloads
我有一个使用自定义键结构的排序字典。为了方便排序,我在key里面有一些变量不想参与相等比较
class
的例子
public struct Key
{
//Needs to participate in equality comparison for SortedDictionary.TryGetValue();
public int intKey;
public object objectKey;
//Needs to be ignored in SortedDictionary.TryGetValue();
public int sortingVariable;
public string otherSortingVariable;
}
我已经尝试重载 Equals
和 GetHashCode
到 new Key().equals(new Key())
returns 正确的程度。
然而,SortedDictionary.TryGetValue(new Key(), out Value)
returns false
排序的实现未使用您实现的方法。相反,您需要在 struct
:
中实现 IComparable<T>
接口
public struct Key : IComparable<Key>
{
public int CompareTo(Key other)
{
return Comparer.Default<string>.Compare(otherSortingVariable, other.otherSortingVariable);
}
}
或自定义 class 实现 IComparer<T>
接口:
public class KeyComparer : Comparer<Key>
{
public override int Compare(Key x, Key y)
{
return Comparer.Default<string>.Compare(x.otherSortingVariable, y.otherSortingVariable);
}
}
并将上述 class 的实例传递给接受自定义比较器的 SortedDictionary
构造函数 overload。
由于您的 SortedDictionary
完全忽略了您所做的覆盖并使用 IComparable
接口来确定相等性 (see this secion),因此您不能使用 TryGetValue
。但是,您可以将 Equals
方法与 Linq 一起使用:
res = dict.Single(kvp => kvp.Key.Equals(comperativeKey)).Value;
不幸的是,您以这种方式失去了所有性能提升,因此如果这是一个问题,您可能需要实现自己的自定义词典。
我有一个使用自定义键结构的排序字典。为了方便排序,我在key里面有一些变量不想参与相等比较
class
的例子public struct Key
{
//Needs to participate in equality comparison for SortedDictionary.TryGetValue();
public int intKey;
public object objectKey;
//Needs to be ignored in SortedDictionary.TryGetValue();
public int sortingVariable;
public string otherSortingVariable;
}
我已经尝试重载 Equals
和 GetHashCode
到 new Key().equals(new Key())
returns 正确的程度。
然而,SortedDictionary.TryGetValue(new Key(), out Value)
returns false
排序的实现未使用您实现的方法。相反,您需要在 struct
:
IComparable<T>
接口
public struct Key : IComparable<Key>
{
public int CompareTo(Key other)
{
return Comparer.Default<string>.Compare(otherSortingVariable, other.otherSortingVariable);
}
}
或自定义 class 实现 IComparer<T>
接口:
public class KeyComparer : Comparer<Key>
{
public override int Compare(Key x, Key y)
{
return Comparer.Default<string>.Compare(x.otherSortingVariable, y.otherSortingVariable);
}
}
并将上述 class 的实例传递给接受自定义比较器的 SortedDictionary
构造函数 overload。
由于您的 SortedDictionary
完全忽略了您所做的覆盖并使用 IComparable
接口来确定相等性 (see this secion),因此您不能使用 TryGetValue
。但是,您可以将 Equals
方法与 Linq 一起使用:
res = dict.Single(kvp => kvp.Key.Equals(comperativeKey)).Value;
不幸的是,您以这种方式失去了所有性能提升,因此如果这是一个问题,您可能需要实现自己的自定义词典。