programing

List는 삽입 순서를 보장합니까?

telecom 2023. 5. 5. 08:34
반응형

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

반응형