查找值与列表中的任何值类似

时间:2016-05-23 17:31:55

标签: c# list

我如何检查以查找我正在查看的值i,是否等于或在列表中的数字范围内?

例如,我在列表中有一个数字i = 2和一个数字i = 2.1,我不想将i = 2添加到列表中,因为它们是公平的相似的数字。我很难找到一个干净的方法来做到这一点。有什么建议吗?

7 个答案:

答案 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)

正如希尔在评论中提到的那样,你必须确定&#34;相似的数字&#34;意味着你,然后实现该逻辑。

对于您的示例,您需要进行简单的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()很有趣。两个相等的元素必须具有相同的哈希码。如果您在生产代码中使用它,您想要测试这始终是真的。