我想知道如何更改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-4-0,c 来源: https://codeday.me/bug/20191121/2055375.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。