LINQ计算出现次数

时间:2011-09-12 18:17:03

标签: c# asp.net linq 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);

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

Count = (OccuranceInTitle * 5) + (OccurancesInBody)

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

1 个答案:

答案 0 :(得分: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);

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

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

更新:此版本使用正如

中的正则表达式
Regex.Replace(title, string.Format("\\b{0}\\b", w), string.Empty)

而不是原始版本的

title.Replace(w, string.Empty)

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