2011-09-12 3 views
3

을 계산합니다. 나는 Linq.Count를 사용할 필요가LINQ 내가 잘 작동 다음 쿼리 한 발행 수

Count = (OccuranceInTitle * 5) + (OccurancesInBody) 

나는 믿고있어하지만이 경우에 적용하는 방법을 잘 모르겠어요 : 나는 예를 들어,뿐만 아니라 제목에 찬성을 체중거야.

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으로 발생을 교체하고 결과 문자열의 길이를 기준으로 계산하는 (놀랍게도) 신속하고 더러운 방법으로 수행됩니다

답변

5

이 내가 생각 해낸 것입니다. 각 기사 및 각 단어에 대한 점수가 계산 된 후 각 기사별로 그룹화하고 모든 단어의 점수 합계를 순서대로 정렬하여 결과에서 청크를 가져옵니다.

필자는 컴파일러를 시작하지 않았으므로 분명한 실수를하지 마십시오.

업데이트 :이 버전은 대신

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"는 "텍사스 아르마딜로의 당나귀"에서 과장되었습니다. – jason

관련 문제