2011-09-12 32 views
3

我有以下查詢偉大的工程:LINQ算OCCURENCES

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,但我不知道如何在這種情況下應用它。

回答

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版本也將匹配字片段)。

+0

打我吧:-) –

+0

哦,那真是太聰明瞭!這甚至自然更重要的更長的單詞,我喜歡它!只是爲了檢查,title.Replace(w,string.Empty)會用單詞組成一個單詞嗎? –

+0

這很危險。它以「The Boring Bookkeepers」這個標題來衡量「Book」。 「同樣的」a「在」德克薩斯州犰狳Aardvarks「中佔有一席之地。 – jason