검색 결과를 위한 형식을 제공합시다. 이 부분은 평가 점수 순으로 정렬할 수 있어야 합니다. 따라서 IComparable 인터페이스를 구현 약속할게요. 이 부분도 파일 입출력이 가능하게 직렬화 가능한 형식으로 정의합시다.
[Serializable] public class RankItem : IComparable<RankItem> { }
멤버 속성으로 사이트 정보인 Item 개체를 참조하는 속성을 추가합니다.
public Item SiteItem { get; private set; }
그리고 개발자 편의를 위해 사이트의 타이틀과 설명, 페이지 주소, 게시 일시, 게시자 정보, 이미지 정보를 가져오기 할 수 있게 속성을 제공합니다.
public string Title { get { return SiteItem.Title; } } public string Description { get { return SiteItem.Description; } } public string Link { get { return SiteItem.Link; } } public DateTime PubDate { get { return SiteItem.PubDate; } } public string Author { get { return SiteItem.Author; } } public string Image { get { return SiteItem.Image; } }
평가 점수를 위한 속성도 제공합니다.
public double Score { get; private set; }
생성자에서는 검색 결과 사이트 정보를 갖고 있는 Item 개체와 평가 점수를 입력받아 속성을 설정합니다.
public RankItem(Item item, double score) { SiteItem = item; Score = score; }
검색 질의에 있는 여러 형태소를 포함하고 있는 페이지일 때 두 개의 RankItem 개체를 하나의 개체로 취합하고 점수를 합산할 필요가 있습니다. 이에 두 개의 RankItem 개체의 평가 점수를 취합하는 메서드를 제공합시다.
public void AddScore(RankItem ri) { Score += ri.Score; }
ToString 메서드를 재정의하여 페이지 주소를 반환합니다.
public override string ToString() { return Link; }
비교 메서드를 제공합시다. 비교는 점수로 합니다.
public int CompareTo(RankItem other) { if (Score > other.Score) { return -1; } if (Score < other.Score) { return 1; } return 0; }
▷ RankItem.cs
using System; namespace RSSBrowserLib { /// <summary> /// 순위화 아이템 개체 /// </summary> [Serializable] public class RankItem : IComparable<RankItem> { /// <summary> /// 아이템 /- 가져오기 /// </summary> public Item SiteItem { get; private set; } /// <summary> /// 타이틀 - 가져오기 /// </summary> public string Title { get { return SiteItem.Title; } } /// <summary> /// 설명 - 가져오기 /// </summary> public string Description { get { return SiteItem.Description; } } /// <summary> /// 페이지 주소 - 가져오기 /// </summary> public string Link { get { return SiteItem.Link; } } /// <summary> /// 게시 일시 - 가져오기 /// </summary> public DateTime PubDate { get { return SiteItem.PubDate; } } /// <summary> /// 게시자 - 가져오기 /// </summary> public string Author { get { return SiteItem.Author; } } /// <summary> /// 이미지 Uri - 가져오기 /// </summary> public string Image { get { return SiteItem.Image; } } /// <summary> /// 점수 - 가져오기 /// </summary> public double Score { get; private set; } /// <summary> /// 생성자 /// </summary> /// <param name="item">아이템</param> /// <param name="score">점수</param> public RankItem(Item item, double score) { SiteItem = item; Score = score; } /// <summary> /// 점수 합산 메서드 /// </summary> /// <param name="ri">합산할 다른 개체</param> public void AddScore(RankItem ri) { Score += ri.Score; } /// <summary> /// ToString 재정의 /// </summary> /// <returns>페이지 주소</returns> public override string ToString() { return Link; } /// <summary> /// 비교 메서드 /// </summary> /// <param name="other">비교 대상</param> /// <returns>비교 결과</returns> public int CompareTo(RankItem other) { if (Score > other.Score) { return -1; } if (Score < other.Score) { return 1; } return 0; } } }