2014-02-22 3 views
1

아티스트라는 개체가 있습니다. 나는 예술가가 메인 프로그램에서 예술가의 내 목록에 포함되어 있는지 여부를 확인하려고C# 비교자를 사용하여 개체 바이너리 검색

public class CompareArtists : IComparer<Artist> 
{ 

    public int Compare(Artist x, Artist y) 
    { 
     if (x.artistID == null) return -1; 
     if (y.artistID == null) return 1; 

    return String.Compare(x.artistID, y.artistID); 
    } 

} 

이 같은 사용자 정의 비교자를 가지고

public class Artist 
{ 
    public string artistID { get; set; } 
    public string artistName { get; set; } 

    public Artist(string artistID, string artistName) 
    { 
     this.artistID = artistID; 
     this.artistName = artistName; 

    } 

    public Artist() 
    { 
    } 
    public Artist(string artistID) 
    { 
     this.artistID = artistID; 
    } 

. 그리고 이렇게 그 일 오전 :

Artist tempArtist = new Artist(user[1]); 
Artist result = new Artist(); 

position = artists.BinarySearch(tempArtist, dc); 
result = artists.ElementAt(position); 
         users.ElementAt(counter).favoriteArtists.Add(result,Int32.Parse(user[2])); 

binarysearch의 결과를, 내가 MSDN에 무엇을 읽고, 다음 가장 큰 인덱스의 보완에서 음수입니다. 결과가 나오지 않을 때 표시됩니다. 그러나 나는 내가 아티스트 목록에서 찾고있는 항목이 실제로 거기에 존재한다는 것을 100 % 확신합니다. 선형 방법을 사용할 때 (예 : 예술가. 단 하나 예술가. 발견하십시오, 나는 결과를 얻는다.

비교 자 또는 바이너리 검색 사용 방법에 문제가 있습니까?

ps : dc는 내 비교 자입니다 : CompareArtists dc = new CompareArtists(); 및 user []는 스트림 리더로 읽은 행에서 분리 된 문자열 배열입니다. 그것은

당신은 BinarySearch하기 전에 목록을 정렬 할 필요가
+2

를 작동되도록하려면? 정렬 된 목록에서만'BinarySearch'를 사용할 수 있기 때문입니다. –

+0

또한 두 명의 아티스트 (둘 다 null ID를 가짐)가 제시되면 비교 자의 경우 잘못된 것을 수행합니다. 이 경우 0을 반환해야합니다. –

+0

목록은 ID가 실제로 주문 된 파일을 읽음으로써 순차적으로 생성됩니다. 그래서 나는 그렇다고 말할 것입니다. 이것이 의미하는 바라면 –

답변

2

, documentation

검색을 참조 전체가 지정된 비교 반환을 사용하여 요소 목록을 분류 사전에 [1] 덕분에 아티스트 ID를 cotains 요소의 제로로부터 시작되는 인덱스

artists.Sort(new CompareArtists()); 
position = artists.BinarySearch(tempArtist, dc); 

은 또한 당신은 Sort에서 같은 비교자를 사용해야하고 BinarySearch은 목록이 정렬되어이

+0

괜찮 았어. 나는 목록이 순차적으로 생성 되었기 때문에 실제로 주문할 것이라고 상상했다. 그러나 아티스트 목록을 정렬 할 때 코드가 작동합니다. 혼란 스럽지만 작동합니다. –

+0

빠른 추적 조사. 나는 실제로 그것들을 문자열로 비교하고있었습니다. 순차적 인 세대에서는 정수로 정렬되었습니다. 문자열로서 순서가 다릅니다. 그것이 작동하지 않는 이유입니다. –