2013-05-28 114 views
2

我有花车的两份名单,并都具有相同的大小,例如:C#LINQ - 相较于浮表

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我想检查是否在列表1所有项目都小于或等于比那些在list2中,例如:

2.1 < = 2.5
1.3 < = 3.3
2.2 < = 4.5
6.9 < = 7.8

在这种情况下,我希望得到结果为true,因为list1中的所有项都是< = list2中的项。什么是最好的有效的方式来做到这一点?

+0

你想要什么,如果列表的长度不同的情况发生? –

+0

是的,我想比较同一个索引值:list1 [0]与list2 [0],list1 [1]与list2 [1],....这两个列表总是有相同的大小,在我的情况下,它是这些列表不可能有不同的大小。 – user1624552

+0

像'new List {2.1,1.3,2.2,6.9}'这样的集合初始值设定项将不起作用,因为您无法将'double'添加到'float'列表中。 –

回答

7

这听起来像你想要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); 

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

编辑:正如评论中指出的那样,这将更有效率,可能会增加可读性(更负面)。

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

是的,我想比较它们的配对,如上面注释中的注释,例如,list1 [0] <= list2 [0],list1 [1] <= list2 [1]等等。而不是x user1624552

+0

@ user1624552:对,已修复操作员。 –

+1

如果你使用'.Contains(false)'而不是'.All(x => x)',那么你只有一个lambda。 –

0
list1.Zip(list2, (x, y) => new { X = x, Y = y }). 
     All(item => (item.X <= item.Y)) 
0
bool result = Enumerable.Range(0, list1.Count).All(i => list1[i] <= list2[i]);