SortedSet<T> 需要使用不同的排序和相等标准
SortedSet<T> need to use different sort and equality criteria
我有一个 class 以前在 HashSet 中使用过。这现在已更改,因此 class 现在在 SortedSet 中使用,但相等性测试不再像以前那样工作。我相信它使用 CompareTo 函数进行排序和比较,这是设计使然。
除了执行我自己的重复检查之外,有人有任何想法吗?
public sealed class DatedID : IEquatable<DatedID>, IComparable
{
readonly DateTime _added;
readonly int _ID;
public DateTime Added
{
get { return _added; }
}
public int ID
{
get { return _ID; }
}
public DatedID(int id)
: this(id, DateTime.Now) {}
public DatedID(int id, DateTime added)
{
id.ThrowDefault("id");
added.ThrowDefault("added");
_ID = id;
_added = added;
}
// Compare
int IComparable.CompareTo(object obj)
{
var other = (DatedID)obj;
// Newest => oldest
return this.Added > other.Added ? -1 : this.Added < other.Added ? 1 : 0;
}
// Equals
public bool Equals(DatedID other)
{
if (other == null) return false;
return this.ID == other.ID;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
var di = obj as DatedID;
return di == null ? false : Equals(di);
}
public override int GetHashCode()
{
return ID.GetHashCode();
}
}
如果您的意思是您需要能够处理具有不同 ID 但相同 DateTime
的多个值,您可以将其包含在您的 CompareTo
实现中:
// TODO: Implement IComparable<DatedID> as well :)
int IComparable.CompareTo(object obj)
{
var other = (DatedID)obj;
int dateComparison = other.Added.CompareTo(this.Added);
return dateComparison != 0
? dateComparison
: _ID.CompareTo(other._ID);
}
如果您的意思是您不想添加具有相同 ID 但 不同 日期的多个值,那么您无法使用 SortedSet
.在 SortedSet
中, 只有 相等性度量是比较 returns 0.
我有一个 class 以前在 HashSet 中使用过。这现在已更改,因此 class 现在在 SortedSet 中使用,但相等性测试不再像以前那样工作。我相信它使用 CompareTo 函数进行排序和比较,这是设计使然。
除了执行我自己的重复检查之外,有人有任何想法吗?
public sealed class DatedID : IEquatable<DatedID>, IComparable
{
readonly DateTime _added;
readonly int _ID;
public DateTime Added
{
get { return _added; }
}
public int ID
{
get { return _ID; }
}
public DatedID(int id)
: this(id, DateTime.Now) {}
public DatedID(int id, DateTime added)
{
id.ThrowDefault("id");
added.ThrowDefault("added");
_ID = id;
_added = added;
}
// Compare
int IComparable.CompareTo(object obj)
{
var other = (DatedID)obj;
// Newest => oldest
return this.Added > other.Added ? -1 : this.Added < other.Added ? 1 : 0;
}
// Equals
public bool Equals(DatedID other)
{
if (other == null) return false;
return this.ID == other.ID;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
var di = obj as DatedID;
return di == null ? false : Equals(di);
}
public override int GetHashCode()
{
return ID.GetHashCode();
}
}
如果您的意思是您需要能够处理具有不同 ID 但相同 DateTime
的多个值,您可以将其包含在您的 CompareTo
实现中:
// TODO: Implement IComparable<DatedID> as well :)
int IComparable.CompareTo(object obj)
{
var other = (DatedID)obj;
int dateComparison = other.Added.CompareTo(this.Added);
return dateComparison != 0
? dateComparison
: _ID.CompareTo(other._ID);
}
如果您的意思是您不想添加具有相同 ID 但 不同 日期的多个值,那么您无法使用 SortedSet
.在 SortedSet
中, 只有 相等性度量是比较 returns 0.