【问题标题】:C# LINQ - Comparing to float listsC# LINQ - 与浮动列表比较
【发布时间】:2013-05-28 08:17:55
【问题描述】:

我有两个浮动列表,并且大小相同,例如:

List<float> list1 = new List<float>{ 2.1, 1.3, 2.2, 6.9 }
List<float> list2 = new List<float>{ 2.5, 3.3, 4.5, 7.8 }

使用 LINQ 我想检查 list1 中的所有项目是否小于或等于 list2 中的项目,例如:

2.1 1.3 2.2 6.9

在这种情况下,我想获得 true 作为结果,因为 list1 中的所有项目都是

【问题讨论】:

  • 如果列表长度不同,您希望发生什么?
  • 是的,我想比较同一索引上的值:list1[0] 与 list2[0],list1[1] 与 list2[1],.... 两个列表也总是相同大小,就我而言,列表不可能有不同的大小。
  • 您的集合初始化器(如 new List&lt;float&gt;{ 2.1, 1.3, 2.2, 6.9 })将不起作用,因为您无法将 doubles 添加到 floats 的列表中。
  • 是的,你是对的,但你可以这样做: List list = new List(new float[]{1.2f,3.2f,4.5f});

标签: c# linq


【解决方案1】:

听起来你想要Zip,如果你真的想要成对比较这些。 (不能说list1 中的所有项目都小于list2 中的所有项目,例如6.9 大于2.5。)

使用Zip

bool smallerOrEqualPairwise = list1.Zip(list2, (x, y) => x <= y)
                                   .All(x => x);

或者:

bool smallerOrEqualPairwise = list1.Zip(list2, (x, y) => new { x, y })
                                   .All(pair => pair.x <= pair.y);

第一个选项更有效,但第二个可能更具可读性。

编辑:如 cmets 中所述,这将更加有效,但可能会牺牲更多可读性(更多负面因素)。

bool smallerOrEqualPairwise = !list1.Zip(list2, (x, y) => x <= y)
                                    .Contains(false);

【讨论】:

  • 是的,我想将它们进行成对比较,如上一条评论中所述,例如 list1[0]
  • @user1624552:对,已经修复了运营商。
  • 如果你使用.Contains(false)而不是.All(x =&gt; x),你就少了一个lambda。
【解决方案2】:
list1.Zip(list2, (x, y) => new { X = x, Y = y }).
      All(item => (item.X <= item.Y))

【讨论】:

    【解决方案3】:
    bool result = Enumerable.Range(0, list1.Count).All(i => list1[i] <= list2[i]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      相关资源
      最近更新 更多