i有一个 float
s的列表,并且要检查它是否已经包含了使用List.Contains()
方法的特定值。我知道,对于float
平等测试,您通常无法使用==
,而是myFloat - value < 0.001
。
我的问题是,Contains
方法是否对此表示帐户,或者我需要使用float
精度错误来测试的方法,如果float在列表中?
来自 List(T).Contains
的文档:
此方法通过使用默认平等比较来确定平等,这是由对象的
IEquatable<T>.Equals
方法实现的t(列表中的值类型)。
因此,您需要自己处理与阈值的比较。例如,您可以使用自己的自定义平等比较。这样的东西:
public class FloatThresholdComparer : IEqualityComparer<float>
{
private readonly float _threshold;
public FloatThresholdComparer(float threshold)
{
_threshold = threshold;
}
public bool Equals(float x, float y)
{
return Math.Abs(x-y) < _threshold;
}
public int GetHashCode(float f)
{
throw new NotImplementedException("Unable to generate a hash code for thresholds, do not use this for grouping");
}
}
并使用它:
var result = floatList.Contains(100f, new FloatThresholdComparer(0.01f))
它仅使用列表中包含的对象的默认相等比较。执行比较时,这将等同于调用object.Equals()
。
如果您需要不同的平等实现,则可以使用接受平等比较的LINQ Contains()
超载。然后,您只需要实现该比较并将其传递。
其他答案是正确的,但是如果您想要一个替代的快速和折叠解决方案而不编写新的平等比较,则可以使用列表。Exists方法:
bool found = list.Exists(num => Math.Abs(num - valueToFind) < 0.001);
编辑: 我的原始答案说以上是LINQ,但是存在方法是列表类的一部分。使用ienumerable使用LINQ相同的概念。任何:
bool found = list.Any(num => Math.Abs(num - valueToFind) < 0.001);