我有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#?
答案 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"
<强>警告:强>
答案 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);