将列表中的每个项目与另一个列表中的另一个项目进

时间:2016-10-22 23:49:25

标签: c# asp.net linq oop

我有2个双重列表

List<double> numbers1 = [1,3,5,6,4.5,2.1,.......];
List<double> numbers2 = [.5,3.2,5.4,6,4.5,2.1,.......];

我想在列表2中的list1 whith [.5]中比较[1]

例如

if([1] close to[.5])

表示fisrst列表中的第一个项目值接近第二个列表中的第一个项目值 等等,第二个是第二个,第三个是第三个

我该怎么做c#?

4 个答案:

答案 0 :(得分:1)

只需使用Math.Abs检查两个相关项目之间的区别:

False

然而,您应该在迭代之前对项目数量进行一些检查。

使用LINQ的替代方法:

bool allElementsClose = true;
for(int i = 0; i < lis1.Count && allElementsClose; i++)
{
    if(Math.Abs(list1[i] - list2[i]) > threshold) 
    {
        Console.WiteLine("items not close");
        allElementsClose = false;
        break;
    }
}

此方法使用select的重载,该重载使用var allElementsClose = list1 .Select((x, i) => Math.Abs(x - list2[i])) .All(x => x < threashhold); 来获取集合中的元素及其索引。然后可以使用该索引获取第二个列表中的相应项目并计算它的差异。

答案 1 :(得分:1)

最简单的解决方案是使用Zip,它用于比较两个集合的每个映射元素,并且还会处理元素数量的差异,因为它会在内部检查Enumerator.MoveNext()

var result = numbers1.Zip(numbers2,(n1,n2) => n1 - n2 < 0.5 ? "Close" : "Not Close");

result IEnumerable<string>由值"Close" and "Not Close"

组成

<强>警告:

  • 你的问题有很多细节缺失,因为我不确定是什么&#34;关闭&#34;什么是&#34;不关闭&#34;,我假设两个数字之间的差异小于0.5,根据要求修改

答案 2 :(得分:0)

实际上,这取决于“近距离”对你意味着什么。 我假设如果数字之间的差异小于1,那么它就接近了。

所以代码非常简单

我将创建3个列表。 list1,list2,listResult (仅包含布尔值,表示list1中的项是否接近list2中的项。

var list1 = new List<float>();
var list2 = new List<float>();
var listResult = new List<bool>();

上面的3行应该在方法或事件之外,例如button1_click。

//to add values to the list you can use list1.addNew(5) and it will add the "5" to the list

void CompareLists(){
    //first of all we check if list1 and list2 have the same number of items
    if(list1.Count == list2.Count){
        for (int i=0; i<list1.Count; i++){                
            if (list1[i] - list2[i] < 1)
               listResult.addNew(true);
            else
               listResult.addNew(false);
        }
    }
}

现在你有一个像boole这样的名单 [TRUE],[TRUE],[FALSE]

希望,它适合你。

答案 3 :(得分:0)

在.Net 4.0中,您还可以使用Zip()

var numbers1 = new List<double>() { 1, 3, 5, 6, 4.5, 2.1 };
var numbers2 = new List<double>() { 0.5, 3.2, 5.4, 6, 4.5, 2.1 };

var allElementsClose = numbers1
    .Zip(numbers2, (i1, i2) => Math.Abs(i1 - i2))
    .All(x => x < threshold);