首页 / C# / C#SortedSet元素相等
C#SortedSet元素相等
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#SortedSet元素相等,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2114字,纯文字阅读大概需要4分钟。
内容图文
我想知道如何更改SortedSet确定两个对象是否相等的方式.
我有SortedSet< Tuple< Edge,int>>(new Helpers.EdgeDistanceComparer())并且Comparer方法是:
public class EdgeDistanceComparer : IComparer<Tuple<Edge,int>>
{
public int Compare(Tuple<Edge, int> x, Tuple<Edge, int> y)
{
return Comparer.Default.Compare(x.Item2, y.Item2);
}
}
我相信由于此Sorted集仅比较整数(Tuple.Item2),如何在Edge类上进行比较
编辑
为了进一步解释问题:
我想按Edge类比较项目,并按Tuple.Item2对项目进行排序,但是如果两个Tuple.Item2相等,我想将该项目添加到SortedSet中.
编辑2
Ben Gave给出了很好的答案,但最终我决定向类中添加一个属性,以便将保存在Tuple.Item2中的值保存在Edge类的属性中.然后我实现了IComparable接口,因此Edge类如下所示:
public class Edge : IComparable
{
public Coordinate Coordinates { get; set; }
public string Value { get; set; }
public Edge Parent { get; set; }
public int Cost { get; set; }
public int CompareTo(object obj)
{
var thatEdge = (Edge) obj;
if (Cost > thatEdge.Cost)
{
return 1;
}
if (Cost < thatEdge.Cost)
{
return -1;
}
// cost may be same but coordinates must be different
if (Cost == thatEdge.Cost &&
(Coordinates.X != thatEdge.Coordinates.X || Coordinates.Y != thatEdge.Coordinates.Y))
{
return -1;
}
return 0;
}
}
和IComparer for SortedSet:
public class EdgeDistanceComparer : IComparer<Edge>
{
public int Compare(Edge x, Edge y)
{
return Comparer.Default.Compare(x, y);
}
}
解决方法:
我相信this answer到另一个问题包含您将最接近想要的东西
在这种情况下,TValue是您的Tuple< Edge,int> ;,因此在构造过程中传递的IComparer与您帖子中的相同. 要使其表现得像Set一样,唯一的其他添加是将检查添加到Add方法,以仅在该集合尚未包含具有相同Edge的项的情况下才添加到该集合.一种方法是:
public void Add(TValue item)
{
if(!_Container.Select(p => p.Value).Contains(item, _equalityComparer)
_Container.Add(Indexed.Create(_Index++, item));
}
其中_equalityComparer是IEqualityComparer< Tuple< Edge,int>如果Edges相等,则返回true.
不幸的是,这有点混乱,我认为它可能会失去您可能希望从SortedSet获得的许多性能优势,但这可能是您可以获得的最好的,因为System.Collections中没有针对此的东西.如果性能不重要,则可以尝试“设置”甚至“列表”,并在需要时进行排序.即使性能很重要,您仍可能需要进行比较,看看效果是否更好.
内容总结
以上是互联网集市为您收集整理的C#SortedSet元素相等全部内容,希望文章能够帮你解决C#SortedSet元素相等所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。