使用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
在发现第一个不符合条件的元素时将停止。所以它看到[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()
。