2012-03-22 3 views
5
내 동료 체크인 몇 가지 코드를 찾고 있었어요

는,이처럼 보였다 :.Net Dictionary가 정렬 된 것처럼 보이는 이유는 무엇입니까?

return list.OrderBy(item => item.Order).ToDictionary(item => item.Id); 

나는 즉시 Dictionary이 해시 테이블이기 때문에 자신의 코드가 아닌 잘못된 것을 내 동료에게 - 정렬 된 컬렉션. 그는 주문 보존 수집 물을 사용하거나, 나중에 그가 foreach으로 사전에서 읽을 때 항목을 정렬해야한다고 말했다.

하지만 그는 대답했습니다. "아니오, 아니요, 코드가 맞습니다.보세요 : OrderBy을 추가 했으므로 항목이 올바른 순서로 나타납니다."

테스트 케이스에서 그는 옳았다. 다른 데이터를 시도했지만 여전히 정렬되었습니다!

나는이 행동에 의지해서는 안되지만 그는 동의하지 않는다. 나는 왜 그런지 설명하는 데 어려움을 겪고있다. 게다가 나는 왜 주문이 그렇게 자주 유지되는 것일까에 관심이있다.

내 질문은 ... Dictionary은 근본적으로 정렬되지 않은 컬렉션인데 왜 분류 된 것처럼 보입니까?

+3

사전 <> 컬렉션이 정렬되지 않은 것을 보장을 제공하지 않습니다 . 목적에 따라 무작위로 사용하지 않습니다. 예, 코드가 잘못되었습니다. –

+1

예 저스틴, 이것은 복제본입니다. 당신이 연결 한 질문에 대한 답은 제가 원했던 것입니다. 사전에 관한 많은 질문 중에서 복제본을 어떻게 빨리 찾을 수 있습니까? 나는 수색하고 그것을 발견 할 수 없었다. 고맙습니다! –

+0

모르겠다. (이것이 내가 코멘트로 올리는 이유이다.)하지만 SQL과 같다고 상상한다 :'SELECT'에 의해 반환 된 행은'ORDER BY' 절이 포함되지 않는 한 불특정 순서로 반환된다. . 특히 작은 데이터 세트에서 행이 삽입 된 순서대로 반환되기 때문에 많은 사람들이 이동합니다. (나는 사람들이 결과의 순서에 대해 신경을 쓰면 사람들에게 '주문'을 포함 시키라고 항상 말합니다. 그것 없이도 작동 할 수도 있지만 무서울 수도 있습니다.) –

답변

6

Dictionary이 어떻게 구현 되었는가 (그리고 항목이 순서대로 추가됨) 때문에 정렬됩니다. 그러나 이것은 구현 세부 사항입니다.

존재하는 SortedDictionary 클래스가 동료에게이 우리가 항목에 의존 할 수 설득해야 간단한 Dictionary로 주문)

+0

구현 세부 사항입니다.하지만 변경 될 것이라고는 생각하지 않습니다. 아마도 Add() 전용 사전은 순서를 보존한다고 말할 수 있습니다. –

+0

@ EldritchConundrum 정말, 당신은 그렇게 생각하지 않아야합니다. 현재의 경우이지만 향후 버전에서는 그렇지 않을 수도 있습니다. 그리고 프레임 워크의 다른 구현 (예를 들어 Mono)에 대해 생각해 보면, 그들이 Dictionary를 동일한 방식으로 구현했다는 보장은 없습니다. – ken2k

+0

예. 더 중요한 것은, 이제는 동료 코드가 실패 할 테스트 케이스를 작성하는 방법을 알았습니다.) foreach를 제거하고 추가하기 만하면됩니다. –

3

사전을 반복 할 때 항목이 the order they were inserted to the dictionary이됩니다.

이 예에서는 목록이 정렬 된 다음 각 항목이 순서대로 사전에 추가됩니다.

최종 결과는 사전의 항목이 목록의 정렬 순서에 따른 것입니다.

그러나 이는 현재 구현 된 Dictionary의 경우 일 수 있습니다. 그런 식으로 유지된다는 보장은 없습니다.

Dictionary의 항목을 특정 순서로 사용해야하는 경우 SortedDictionary을 사용해야합니다.

+0

당신은 그들이 왜 분류되는지 더 잘 설명 할 수 있습니까? 나는 그들이 "Id"속성 인 해시에 의해 "주문"되었다고 말할 것입니다. –

+1

@LuisFilipe - 나는 따라 가지 않습니다. 목록이 정렬되었습니다 ('list.OrderBy (item => item.Order)'그런 다음'Dictionary'로 변환됩니다. 변환은 각 항목을 사전에 추가하여 작동합니다. 사전의 항목은 삽입 순서에 따라 "정렬 됨"입니다. 그들은 순서대로 _inserted_ 되었기 때문에 사전이 순서대로 있습니다. – Oded

+0

사양/계약서에 의해 보증 되었습니까? 아니면 특정 구현이 작성된 방법의 결과물입니까? 그것이 행동을 보증한다면 표창장이 유용 할 것이다. –

관련 문제