代码之家  ›  专栏  ›  技术社区  ›  SharpAffair

Linq关键字提取-限制提取范围

  •  3
  • SharpAffair  · 技术社区  · 15 年前

    this solution .

    3 回复  |  直到 9 年前
        1
  •  2
  •   Jon Skeet    15 年前

    简单地应用 Take Split :

    var results = src.Split()
                     .Take(1000)
                     .GroupBy(...) // etc
    
        2
  •  1
  •   Marc Gravell    15 年前

    严格来说,林克是 不 一定要把所有的东西都读一遍;Take会尽快停止的。问题是在相关的问题中,你看计数,如果不消耗所有的数据,很难得到计数。同样的,string.Split会看到 .

    但是,如果您编写了一个惰性的非缓冲拆分函数(使用yield return),并且您想要前1000个唯一的单词,那么

    var words = LazySplit(text).Distinct().Take(1000);
    

        3
  •  1
  •   Ani    15 年前

    Enumerable.Take 事实上,stream不会产生结果;它不会完全缓冲源,然后只返回第一个N Take 是 String.Split . 不幸的是,这个方法不使用任何延迟执行;它急切地创建一个包含所有“split”的数组,然后返回它。

    var words = src.StreamingSplit()  // you'll have to implement that            
                   .Take(1000);
    

    不过,我确实注意到,您的其余查询是:

    ...
    .GroupBy(str => str)   // group words by the value
    .Select(g => new
                 {
                    str = g.Key,      // the value
                    count = g.Count() // the count of that value
                  });
    

    请注意 GroupBy

    在我看来,选择是:

    1. 如果你不介意通读所有的课文 那么,目的 src.Split().Take(1000) 很好。缺点是浪费时间(不再需要继续拆分)和浪费空间(将所有单词存储在一个数组中,即使只有前1000个单词)。然而 休息
    2. 如果由于时间/内存限制,您无法负担(1)的费用,请使用 src.StreamingSplit().Take(1000)

    请注意这1000个字 他们自己 最终会被 分组

    推荐文章