리스트 게재 신청서를 보장 하시겠습니까?
목록에 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
이 동일하게 동작해야하므로. 도움이 되나요?
물론 전자는 선택한 항목이 목록의 마지막 항목이 아닌 경우에만 작동하고 후자는 선택한 항목이 첫 번째 항목이 아닌 경우에만 작동합니다.
작업 순서를 변경하면 이상한 동작을 피할 수 있습니다. 먼저 목록의 올바른 위치에 값을 삽입 한 다음 첫 번째 위치에서 삭제하십시오. 참조로 삭제하면 둘 다 삭제할 수 있으므로 색인으로 삭제해야합니다.
참고 URL : https://stackoverflow.com/questions/1043039/does-listt-guarantee-insertion-order
'Programing' 카테고리의 다른 글
람다 이벤트 핸들러를 제거하는 방법 (0) | 2020.04.23 |
---|---|
프로그래밍 방식으로 작성된 컨텐츠 뷰를 사용하여 활동에 프래그먼트를 추가하는 방법 (0) | 2020.04.23 |
모든 JavaScript 오류를 잡아서 서버로 전송 (0) | 2020.04.23 |
v4 이전에 MongoDB가 ACID를 준수하지 않는 것은 실제로 무엇을 의미 했습니까? (0) | 2020.04.23 |
최신 Linux 박스가 가질 수있는 이론상 최대 개방 TCP 연결 수는 얼마입니까? (0) | 2020.04.23 |