List는 삽입 순서를 보장 합니까?
목록에 문자열이 3개 있다고 가정합니다(예: "1", "2", "3").
그런 다음 위치 1에 "2"(예: "2", "1", "3")를 배치하도록 다시 주문하고 싶습니다.
다음 코드를 사용하고 있습니다(indexToMoveTo를 1로 설정).
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
이것은 효과가 있는 것처럼 보이지만 가끔 이상한 결과가 나옵니다. 때때로 주문이 잘못되었거나 목록에서 항목이 삭제됩니다!
아이디어 있어요?한다List<T>
보증 주문서?
관련:
클래스는 순서 지정을 보장합니다. 목록을 명시적으로 정렬하지 않는 한 중복 항목을 포함하여 추가한 순서대로 목록에 유지됩니다.
MSDN에 따라:
...List "인덱스로 액세스할 수 있는 강력한 유형의 개체 목록을 나타냅니다."
이 값이 정확하려면 인덱스 값을 신뢰할 수 있어야 합니다.따라서 주문이 보장됩니다.
목록에서 나중에 항목을 이동하는 경우 코드에서 이상한 결과가 나타날 수 있습니다. 로 호출하기 전에 다른 모든 항목을 한 곳으로 이동하기 때문입니다.
당신의 코드를 게시할 수 있을 만큼 작은 것으로 줄여 주시겠습니까?
여기 인덱스가 있는 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
정확한 결과를 얻으려면 인덱스 2를 사용해야 합니다.일관성을 유지하려면 다음 주소로 보내야 합니다(indexToMoveTo-1).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
이다.ListBox
물론 그래서 리스트는.ListBox.ObjectCollection
조금도 아닌List<T>
하지만 그것은 유전됩니다.IList
그래서 그것은 똑같이 행동해야 합니다.이게 도움이 되나요?
물론 전자는 선택한 항목이 목록의 마지막 항목이 아닌 경우에만 작동하고 후자는 선택한 항목이 첫 번째 항목이 아닌 경우에만 작동합니다.
작업 순서를 변경할 경우 다음과 같은 이상한 동작을 피할 수 있습니다.먼저 목록의 올바른 위치에 값을 삽입한 다음 첫 번째 위치에서 삭제합니다.그의 인덱스로 삭제해야 합니다. 참조로 삭제할 경우 둘 다 삭제할 수 있기 때문입니다.
언급URL : https://stackoverflow.com/questions/1043039/does-listt-guarantee-insertion-order
'programing' 카테고리의 다른 글
개인 저장소 복제(Github) (0) | 2023.05.05 |
---|---|
요소를 수평으로 중앙에 배치하려면 어떻게 해야 합니까? (0) | 2023.05.05 |
바인딩 항목WPF 데이터 그리드의 ComboBox 열 원본 (0) | 2023.05.05 |
DateTime 속성의 기본값을 DateTime으로 설정하는 중입니다.이제 시스템 안으로 들어갑니다.ComponentModel 기본값 특성입니다. (0) | 2023.04.25 |
매개 변수를 Bash 함수에 전달합니다. (0) | 2023.04.25 |