我有一些看似这样的简单代码:
SortedDictionary<String, long> d = new SortedDictionary<String, long>();
// d is then populated with an expensive time-consuming process
ListBox lb = new ListBox();
lb.ItemsSource = d; // THIS WORKS GREAT
现在我想做的是动态显示字典的子集而不必重新计算它。
// min is assigned somewhere else
lb.ItemsSource = d.SkipWhile( kvp => kvp.Value < min ); // THIS DOESN'T WORK
.SkipWhile()返回一个IEnumerable,这对于foreach循环很有用,但对于ItemsSource来说不是那么热。
A)有没有办法以这种方式将类似LINQ的表达式传递给WPF控件?
B)如果做不到,有没有办法做类似的事情:
// Put things back, like the .ToArray() syntax
d.SkipWhile( kvp => kvp.Value < min).ToSortedDictionary();
C)如果失败了,有没有办法有条件地从实际字典中删除条目?
d.RemoveWhere( kvp => kvp.Value < min );
的更新:
过滤效果不符合我的预期。结果我对.SkipWhile()的理解是基于bum文档源的错误。
// This is what I was seeing and seemed strange
Console.WriteLine("Total = " + dict.Count");
Console.WriteLine(" Skip = " + dict.SkipWhile( kvp => kvp.Value < 3 ).Count());
foreach ( var kvp in dict.SkipWhile( kvp => kvp.Value < 3 ) ) {
Console.WriteLine( kvp );
}
导致:
Total = 33350
Skip = 33350
[ 0, 1042 ]
[ 00, 52 ]
[ 000, 55 ]
[ 001, 1 ]
[ 002, 1 ]
[ 003, 1 ]
...
我没想到.Value小于3的行。
使用.Where()代替,如答案中所述,解决了问题。
答案 0 :(得分:3)
SortedDictionary
按键排序,而不是按值排序,因此SkipWhile
方法不会跳过值小于最小值的所有项目,它将从最小的键开始,只有在找到值大于或等于最小值的项目之前才跳过项目。
如果要过滤掉值小于最小值的所有项目,请使用Where
方法:
lb.ItemsSource = s.Where(kvp => kvp.Value < min);
这会创建一个表达式,根据需要从SortedDictionary
读取。