使用TakeWhile()返回值的范围

时间:2013-08-06 20:49:46

标签: c# linq

我正在使用takewhile以这种方式对一系列值进行分类:

 var Range_1 = Dictionary_Name.TakeWhile (x=> x.Value < 50).toList();

字典(String,int)包含如下值:

 [Item 1, 10]
 [Item 2, 20]
 [Item 3, 5]
 [Item 4, 3]
 [Item 5, 41]
 ,...

我正在使用的代码会生成正确的结果,但是当我将值更改为like:

 var Range_1 = Dictionary_Name.TakeWhile (x=> x.Value < 10).toList();

它返回一个空的集合。

我想知道它为什么不返回任何东西。

3 个答案:

答案 0 :(得分:10)

TakeWhile会在找到与条件不匹配的第一个元素时停止。所以它看到[Item 1, 10],其值不小于10,因此它会停止迭代。

也许您想要Where (t => t.Value < 10),而只会返回小于10的所有值。

答案 1 :(得分:1)

第一个元素的值为10,条件为(x=> x.Value < 10),因此必须返回空集。如果您只想过滤值&lt; 10,使用Where代替TakeWhile

答案 2 :(得分:0)

枚举时,

Dictionary<TKey,TValue>不会以任何特定顺序返回其键/值对。它应该是可重复的,只要在枚举之间不修改字典,但我相信,顺序依赖于每个键的计算哈希值,插入值的顺序以及放置每个项目的哈希桶

如果您想要有序集合,请查看以下System.Collections.Generic类:

Linq也可以使用它的Join()方法:

Dictionary<int,string>     dictionary = GetSomeDictionary() ;
KeyValuePair<int,string>[] matches    = Enumerable.Range(1,50)        // outer (left) set
                                                  .Join( dictionary , // inner (right) set
                                                     x => x         , // outer key selector
                                                     y => y.Key     , // inner key selector
                                                     (x,y) => y       // result selector
                                                  )
                                                  .ToArray()
                                                  ;

或者,正如@zxspectrum指出的那样,使用Where()代替TakeWhile()