목록에 3 개의 문자열이 있다고 가정합니다 (예 : “1”, “2”, “3”).
그런 다음 위치 1에 “2”를 배치하도록 순서를 바꾸고 싶습니다 (예 : “2”, “1”, “3”).
이 코드를 사용하고 있습니다 (indexToMoveTo를 1로 설정).
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
이것은 효과가있는 것 같지만 때때로 이상한 결과가 나타납니다. 때로는 주문이 잘못되었거나 목록의 항목이 삭제되는 경우가 있습니다!
어떤 아이디어? List<T>
주문을 보증 합니까 ?
관련 :
답변
List<>
클래스는 보증 주문을한다 – 일이 중복 포함하여, 추가 된 순서대로 목록에 유지됩니다 당신이 명시 적으로 목록을 정렬하지 않는 한.
MSDN에 따르면 :
… List ” index 로 액세스 할 수있는 강력한 형식의 개체 목록을 나타냅니다 .”
이것이 정확하려면 인덱스 값을 신뢰할 수 있어야합니다. 따라서 주문이 보장됩니다.
을 Remove()
호출하기 전에 다른 모든 항목을 한 곳 아래로 이동 하므로 목록에서 나중에 항목을 이동하면 코드에서 이상한 결과를 얻을 수 있습니다 Insert()
.
코드를 게시하기에 충분히 작은 것으로 끓일 수 있습니까?
답변
색인과 함께 4 개의 항목이 있습니다.
0 1 2 3
K C A E
K를 A와 E 사이로 이동하려고합니다. 위치 3을 생각할 수 있습니다. 제거 후 모든 색인이 업데이트되므로 색인 작성에주의해야합니다.
따라서 항목 0을 먼저 제거하고
0 1 2
C A E
그런 다음 3시에 삽입합니다
0 1 2 3
C A E K
올바른 결과를 얻으려면, 당신은 (indexToMoveTo-1)로 보내야합니다 상황이 일관성을 유지하기 위해 사용되는 인덱스 2를해야한다 if indexToMoveTo > indexToMove
, 예를 들어,
bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove);
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo);
문제와 관련이있을 수 있습니다. 내 코드는 테스트되지 않았습니다.
편집 : 또는 상황에 해당하는 경우 Sort
사용자 지정 비교기 ( IComparer
)를 사용할 수도 있습니다.
답변
Bevan이 말했듯이 명단 인덱스는 0부터 시작합니다. 요소를 목록의 맨 앞으로 이동하려면 색인 0에 삽입해야합니다 (예에 표시된대로 1이 아님).
답변
이것은 항목을 목록에서 한 장소 아래로 이동시키는 데 필요한 코드입니다.
if (this.folderImages.SelectedIndex > -1 && this.folderImages.SelectedIndex < this.folderImages.Items.Count - 1)
{
string imageName = this.folderImages.SelectedItem as string;
int index = this.folderImages.SelectedIndex;
this.folderImages.Items.RemoveAt(index);
this.folderImages.Items.Insert(index + 1, imageName);
this.folderImages.SelectedIndex = index + 1;
}
그리고 이것은 한 곳 위로 이동하기위한 것입니다.
if (this.folderImages.SelectedIndex > 0)
{
string imageName = this.folderImages.SelectedItem as string;
int index = this.folderImages.SelectedIndex;
this.folderImages.Items.RemoveAt(index);
this.folderImages.Items.Insert(index - 1, imageName);
this.folderImages.SelectedIndex = index - 1;
}
folderImages
A는 ListBox
리스트가 그래서 물론이 ListBox.ObjectCollection
아닌을 List<T>
하지만,이 상속 않습니다 IList
이 동일하게 동작해야하므로. 도움이 되나요?
물론 전자는 선택한 항목이 목록의 마지막 항목이 아닌 경우에만 작동하고 후자는 선택한 항목이 첫 번째 항목이 아닌 경우에만 작동합니다.
답변
작업 순서를 변경하면 이상한 동작을 피할 수 있습니다. 먼저 목록의 올바른 위치에 값을 삽입 한 다음 첫 번째 위치에서 삭제하십시오. 참조로 삭제하면 둘 다 삭제할 수 있으므로 색인으로 삭제해야합니다.
답변
