C#/ .NET / WPF:从LINQ获取子集,而不是IEnumerable

时间:2010-09-02 13:59:35

标签: .net wpf linq collections ienumerable

我有一些看似这样的简单代码:

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()代替,如答案中所述,解决了问题。

1 个答案:

答案 0 :(得分:3)

SortedDictionary按键排序,而不是按值排序,因此SkipWhile方法不会跳过值小于最小值的所有项目,它将从最小的键开始,只有在找到值大于或等于最小值的项目之前才跳过项目。

如果要过滤掉值小于最小值的所有项目,请使用Where方法:

lb.ItemsSource = s.Where(kvp => kvp.Value < min);

这会创建一个表达式,根据需要从SortedDictionary读取。