我如何检查以查找我正在查看的值i
,是否等于或在列表中的数字范围内?
例如,我在列表中有一个数字i = 2
和一个数字i = 2.1
,我不想将i = 2
添加到列表中,因为它们是公平的相似的数字。我很难找到一个干净的方法来做到这一点。有什么建议吗?
答案 0 :(得分:2)
您可以在添加之前检查任何类似的值。在LINQ中表达了nicelly:
var list = new List<double> { 2.1, 4, 5, 5.1 };
var i = 2;
var e = 0.5;
var hasSimilar = list.Any(x => Math.Abs(x - i) <= e);
if(!hasSimilar)
list.Add(i);
答案 1 :(得分:1)
测试值是否在特定范围内的常用方法是使用Math.Abs
。例如,如果您要查找noImplicitAny
0.5
内的所有数字,可以按以下方式找到它们:
2
答案 2 :(得分:1)
试试这个..........
List<double> list = new List<double>();
list.Add(1);
list.Add(2.1);
list.Add(3.5);
list.Add(4.9);
list.Add(5);
double i=2;
int cnt = 0;
foreach(var item in list)
{
if(i==item || i==(item-0.1))
{
cnt = 1;
}
}
if(cnt<1)
{
list.Add(i);
}
答案 3 :(得分:0)
对于您的示例,您需要进行简单的if
检查以查看数字是否在所需范围内。
if (i >= 2 && i < 2.2)
listName.Add(i);
答案 4 :(得分:0)
List<double> myList = new List<double>();
//Build list
double epsilon = 0.5;
double newValue = ...;
bool addToList = true;
foreach(double val : myList)
if(Math.Abs(val - newValue) < epsilon)
{
addToList = false;
break; //You don't need to check any further
}
if(addToList)
myList.Add(newValue);
答案 5 :(得分:0)
如果您期望负数不要使用Abs,请尝试使用Floor或Ceiling。
Double i = 4;
List<double> ListOfNumbers = new List<double>();
Double Floored = Math.Floor(i);
if (!ListOfNumbers.Contains(Floored))
{//If not found add the number for later
ListOfNumbers.Add(Floored);
}
答案 6 :(得分:0)
如果您创建这样的自定义比较器:
class CloseEnough : IEqualityComparer<double>
{
public bool Equals(double a, double b)
{
return Math.Abs(a - b) <= 0.5;
}
public int GetHashCode(double a)
{
return 2 * (Convert.ToInt32(a) / 2);
}
}
然后你可以在创建一个集合时使用它:
var comparer = new CloseEnough();
var set = new HashSet<double>(comparer);
一旦你获得了这个集合,你只需要添加元素,任何与现有元素太接近的元素都会被自动拒绝:
set.Add(1);
set.Add(1.1);
set.Add(1.6);
set.Add(2.1);
set.Add(2.11);
set.Add(10);
以上结果为set == { 1, 1.6, 2.11, 10 }
。
请注意CloseEnough.GetHashCode()
很有趣。两个相等的元素必须具有相同的哈希码。如果您在生产代码中使用它,您想要测试这始终是真的。