public class ToleranceEqualityComparer : IEqualityComparer<double>
{
public double Tolerance { get; set; } = 0.02;
public bool Equals(double x, double y)
{
return x - Tolerance <= y && x + Tolerance > y;
}
//This is to force the use of Equals methods.
public int GetHashCode(double obj) => 1;
}
你应该这样使用
var dataByPrice = data.GroupBy(d => d.Price, new ToleranceEqualityComparer());
2条答案
按热度按时间falq053o1#
在我看来,如果您有一个大型数据集,您可能希望避免直接对值进行排序,然后在迭代排序列表时收集它们,因为对一个大的集合进行排序是非常昂贵的。我能想到的不进行任何显式排序的最有效的解决方案是构建一个树,其中每个节点都包含键福尔斯在“连续”范围内的项(其中所有键彼此之间的距离都在
tolerance
以内)--每次添加超出范围小于tolerance
的项时,每个节点的范围都会扩展。并且根据我的粗略基准测试,用这种方法完成它所花费的时间大约是直接解决方案的一半。这是我作为扩展方法的实现(这样您就可以链接它,尽管像普通的
Group
方法一样,一旦结果IEnumerable
被迭代,它就会完全迭代source
)。如果需要,可以将
double
切换为另一种类型(我真希望C#有一个numeric
泛型约束)。p4rjhz4m2#
最直接的方法是设计您自己的
IEqualityComparer<double>
。你应该这样使用