특정 순서로 채워진 목록 컬렉션이 있습니다 (요구 사항은이 순서를 변경할 수 없음). 이 목록에는 엔티티 유형 객체가 들어 있습니다.목록에서 요소의 최적 위치 찾기
목록을 처음 채운 후에 다른 데이터 원본에서 오는 개체를 몇 개 더 삽입해야합니다. 이러한 객체는 특정 위치에 삽입해야 정렬이 정확합니다. 초기 목록 요소
- AAA 다음과 같은 경우 예를 들어
- AAB
- AAC
- ACC 초기 인구 후
- ADA
나는 "ABB를 삽입 할 "요소 인 경우 3에서 4 사이에 삽입해야합니다.
현재 나는 새로운 요소에 대한 올바른 위치를 찾는 다음과 같은 방법이 있습니다.
private static int FindPositionForArticle(string word)
{
string key = word.ToLower();
for (int i = word.Length; i >= 0; i--)
{
if(i < word.Length)
key = key.Remove(i, 1);
int pos = 0;
int insertPos = 0;
foreach(ArticleEntity article in list)
{
if(article.Text.ToLower().StartsWith(key))
insertPos = pos;
else if (!article.Text.ToLower().StartsWith(key) && insertPos > 0)
return insertPos++;
pos++;
}
}
return 0;
}
이 방법 뒤에 목적 아이디어 :
테이크 "단어"삽입 "단어"
것처럼 동일한 이름을 가진 요소의 위치를 찾으려고 할 필요가 아무것도 발견되지 않았으며 "단어"에서 마지막 문자를 제거하고 다시 검색하십시오.
최상의 위치가 발견 될 때까지 마지막 문자를 반복하여 제거하십시오.
불행히도 내 방법에는 버그가 있습니다 (잘못 구현 됨). 현재 나의 방법은 최상의 위치가 0 일 것을 제안하는데, 이것은 완전히 부정확합니다. 당신은 내 예제 코드와 함께 재생하려면
당신은 그것을 다운로드 할 수 있습니다 :
http://dl.getdropbox.com/u/204110/FindPosition.cs.txt
사전에 감사합니다.
문제는 내 목록 실제로 공용 클래스 ArticleEntityCollection입니다 : ObservableCollection에 내가 간단한 목록 –
그래, 불행하게도 ObservableCollection에 구현하지 않습니다 BinarySearch에 내 코드를 리팩토링해야 할 수 있습니다. 관찰 가능한 기능이 정말로 필요하다면 List에서 항상 파생 될 수 있으며 목록이 변경되었음을 알리는 이벤트를 발생시키는 추가/제거 기능을 무시할 수 있습니다. –
리스트으로 리팩토링했습니다. ObservableCollection 기능을 사용하지 않았기 때문에. 당신의 솔루션은 잘 작동했습니다. –