代码之家  ›  专栏  ›  技术社区  ›  Walt Stoneburner

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

  •  1
  • Walt Stoneburner  · 技术社区  · 16 年前

    我有一些琐碎的代码如下所示:

    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就不那么热门了。

    B) 如果做不到这一点,有没有办法做到:

    // Put things back, like the .ToArray() syntax
    d.SkipWhile( kvp => kvp.Value < min).ToSortedDictionary();
    

    C) 如果做不到这一点,有没有办法有条件地从实际词典中删除条目?

    d.RemoveWhere( kvp => kvp.Value < min );
    


    更新 :

    // 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 ]
    ...
    

    我没想到。值小于3的行。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Guffa    16 年前

    这个 SortedDictionary SkipWhile 方法不会跳过值小于最小值的所有项,它将从最小键开始,只跳过项,直到找到值大于或等于最小值的项为止。

    Where 方法:

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

    这将创建一个从 分类词典

    推荐文章