使用TakeWhile()返回值的范围

本文关键字:范围 返回值 TakeWhile 使用 | 更新日期: 2023-09-27 18:26:36

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

 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();

它返回一个空集合。

我想知道为什么它什么都不回。

使用TakeWhile()返回值的范围

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

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

第一个元素的值为10,条件为(x=> x.Value < 10),因此必须返回空集。如果您只想筛选值<10,使用Where而不是TakeWhile

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

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

  • SortedDictionary<K,V>
  • SortedList
  • SortedSet

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()