2

我正在使用 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]
 ,...

然后我使用的代码会产生正确的结果,但是当我将值更改为喜欢时:

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

它返回一个空集合。

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

4

3 回答 3

11

TakeWhile当它发现第一个不符合条件的元素时将停止。所以它看到[Item 1, 10],它的值不小于 10,所以它停止迭代。

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

于 2013-08-06T20:52:52.573 回答
1

第一个元素的值为 10,条件是(x=> x.Value < 10),所以它必须返回空集。如果您只想过滤小于 10 的值,请使用Where而不是TakeWhile.

于 2013-08-06T20:55:21.470 回答
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().

于 2013-08-06T21:18:17.710 回答