Programing

리스트

lottogame 2020. 4. 23. 07:38
반응형

리스트 게재 신청서를 보장 하시겠습니까?


목록에 3 개의 문자열이 있다고 가정합니다 (예 : "1", "2", "3").

그런 다음 위치 1에 "2"를 배치하도록 순서를 바꾸고 싶습니다 (예 : "2", "1", "3")

이 코드를 사용하고 있습니다 (indexToMoveTo를 1로 설정).

listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);

이것은 효과가있는 것 같지만 때때로 이상한 결과가 나타납니다. 때로는 주문이 잘못되었거나 목록의 항목이 삭제되는 경우가 있습니다!

어떤 아이디어? List<T>주문을 보증 합니까 ?

관련 :

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;
}

folderImagesA는 ListBox리스트가 그래서 물론이 ListBox.ObjectCollection아닌을 List<T>하지만,이 상속 않습니다 IList이 동일하게 동작해야하므로. 도움이 되나요?

물론 전자는 선택한 항목이 목록의 마지막 항목이 아닌 경우에만 작동하고 후자는 선택한 항목이 첫 번째 항목이 아닌 경우에만 작동합니다.


작업 순서를 변경하면 이상한 동작을 피할 수 있습니다. 먼저 목록의 올바른 위치에 값을 삽입 한 다음 첫 번째 위치에서 삭제하십시오. 참조로 삭제하면 둘 다 삭제할 ​​수 있으므로 색인으로 삭제해야합니다.

참고 URL : https://stackoverflow.com/questions/1043039/does-listt-guarantee-insertion-order

반응형