У меня есть некоторый тривиальный код, который выглядит следующим образом:
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 );
UPDATE :
Фильтрация не работает от того, что я ожидал. Оказывается, мое понимание .SkipWhile () было неверным, основываясь на исходном источнике документации.
// 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 меньше трех.
Использование .Where () вместо этого, как объяснено в ответе, решило проблему.