LINQ计算出现次数

Tom*_*len 3 c# linq asp.net search count

我有以下查询,它很有用:

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);
Run Code Online (Sandbox Code Playgroud)

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

Count = (OccuranceInTitle * 5) + (OccurancesInBody)
Run Code Online (Sandbox Code Playgroud)

我假设我需要使用Linq.Count但我不确定如何在这个实例中应用它.

Jon*_*Jon 5

这就是我想出的:

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)
Run Code Online (Sandbox Code Playgroud)

而不是原始版本

title.Replace(w, string.Empty)
Run Code Online (Sandbox Code Playgroud)

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