【问题标题】:LINQ to count occurrencesLINQ 计算出现次数
【发布时间】:2011-11-15 13:33:00
【问题描述】:

我有以下查询很好用:

string[] Words = {"search","query","example"};

... Snip ...

var Results = (
    from a in q
    from w in Words
    where
        (
        a.Title.ToLower().Contains(w)
        || a.Body.ToLower().Contains(w)
        )
    select new
    {
        a,
        Count = 0
    }).OrderByDescending(x=> x.Count)
    .Distinct()
    .Take(Settings.ArticlesPerPage);

我需要它做的是返回Count,这是单词的总出现次数。我也将加权它以支持标题,例如:

Count = (OccuranceInTitle * 5) + (OccurancesInBody)

我假设我需要使用 Linq.Count,但我不确定如何在这种情况下应用它。

【问题讨论】:

    标签: c# asp.net linq search count


    【解决方案1】:

    这是我想出的:

    var query =
        from a in q
        from w in Words
        let title = a.Title.ToLower()
        let body = a.Body.ToLower()
        let replTitle = Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)
        let replBody = Regex.Replace(body, string.Format("\\b{0}\\b", w), string.Empty)
        let titleOccurences = (title.Length - replTitle.Length) / w.Length
        let bodyOccurences = (body.Length - replBody.Length) / w.Length
        let score = titleOccurences * 5 + bodyOccurences
        where score > 0
        select new { Article = a, Score = score };
    
    var results = query.GroupBy(r => r.Article)
                       .OrderByDescending(g => g.Sum(r => r.Score))
                       .Take(Settings.ArticlesPerPage);
    

    使用(令人惊讶的)快速而肮脏的方法将出现次数替换为string.Empty 并根据生成的字符串长度进行计算来计算出现次数。在计算每篇文章和每个单词的分数后,我对每篇文章进行分组,按所有单词的分数总和排序,并从结果中取出一个块。

    我没有启动编译器,所以请原谅任何明显的错误。

    更新:此版本使用正则表达式,如

    Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)
    

    代替原版的

    title.Replace(w, string.Empty)
    

    现在它只匹配整个单词(string.Replace 版本也将匹配单词片段)。

    【讨论】:

    • 哦,好聪明!甚至更自然地加重更长的单词,我喜欢它!只是为了检查一下,title.Replace(w, string.Empty) 会用一个单词数组来单词吗?
    • 这很危险。它在标题“无聊的簿记员”中计算了“书”。同样,“a”在“得克萨斯州犰狳的土豚”中也被高估了。
    • @Jason:很好。这可以通过使用Regex.Replace 而不是string.Replace 来解决——我会解决的。
    • @TomGullen:实际上它并没有更重的词,因为它将差异除以 w.Length 就这样(您需要向右滚动才能看到它)。
    • 我已经通过删除停用词过滤了单词(因此搜索“文件”将搜索“文件”),“Bookkeepers”中的“Book”匹配也适合我的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2012-10-20
    相关资源
    最近更新 更多