【问题标题】:compare each item in list with another item in another list将列表中的每个项目与另一个列表中的另一个项目进行比较
【发布时间】:2016-10-22 23:49:24
【问题描述】:

我有 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,.......];

我想比较 list1 中的 [1] 和 list 2 中的 [.5]

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

这意味着如果第一个列表中的第一项值接近第二个列表中的第一项值 等等,第二个和第二个,第三个和第三个

我该怎么做这个 c#?

【问题讨论】:

  • 预期回报是多少?
  • 改写/编辑您的问题并解释您想如何比较...如果列表 1 的数字比列表 2 多,该怎么办?

标签: c# asp.net linq oop


【解决方案1】:

使用Math.Abs 简单检查两个相关项目之间的差异:

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;
    }
}

但是,您应该在迭代之前检查项目的数量。

使用 LINQ 的替代方法:

var allElementsClose = list1
    .Select((x, i) => Math.Abs(x - list2[i]))
    .All(x => x < threashhold);

此方法使用 select 的重载,该重载使用 Func&lt;T, int&gt; 来获取集合中的元素及其索引。然后可以使用该索引来获取第二个列表中的适当项目并计算与它的差异。

【讨论】:

  • list1 必须有 i 作为索引器
  • int i = i > i 没有被实例化,所以我猜你的意思是int i = 0
【解决方案2】:

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

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

result 将由 IEnumerable&lt;string&gt; 组成的值 "Close" and "Not Close"

警告:

  • 您的问题缺少很多细节,因为我不确定什么是“关闭”和什么是“未关闭”,我假设两个数字之间的差异小于 0.5 是接近的,请根据要求修改

【讨论】:

  • 很酷的解决方案,不知道这种方法存在。
  • @HimBromBeere :),Linq 中存在许多这样的宝石,事实上许多已知的 API 都有有趣的重载来实现结果
【解决方案3】:

实际上,这取决于“关闭”对您意味着什么。 我会假设如果数字之间的差异小于 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);
        }
    }
}

现在您有一个布尔值列表,例如 [真],[真],[假]

希望,它对你有用。

【讨论】:

    【解决方案4】:

    在 .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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 2021-10-17
      • 2020-10-16
      • 2022-01-22
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多