.NET Foreach 명세서가 구축 된 것과 동일한 순서로 컬렉션을 반복하도록 보장됩니까?

StackOverflow https://stackoverflow.com/questions/612486

  •  03-07-2019
  •  | 
  •  

문제

동료는 루프를 사용하여 일부 C# 코드에서 목록을 반복하여 썼고 의견을 남겼습니다. 예를 들어, 다음과 같은 목록이 있다고 가정합니다.

var someList = new List<string>();

someList.Add("one");
someList.Add("two");
someList.Add("three");

내 동료는 다음과 같은 것을 사용했습니다.

for (int i = 0; i < someList.Count; i++)    
{
    System.Diagnostics.Debug.WriteLine(someList[i]);
}

대신 :

foreach (var item in someList)              
{
    System.Diagnostics.Debug.WriteLine(item);
}

나는 그가 컬렉션에 추가 된 것과는 다른 순서로 나올 수 있다고 두려워합니다. 나는 그가 약간 편집증이라고 생각하지만 기술적으로 문서는 컬렉션이 반복되는 순서를 명시하지 않습니다. Foreach 명령문이 가장 낮은 바운드에서 가장 높은 순서로 배열 또는 수집 객체를 통과 할 수 있습니까?

도움이 되었습니까?

해결책

귀하의 질문은 a List<T>, 순서를 유지합니다.

혼자서 외관은 아무것도 보장하지 않습니다. 그것은 단지 잠재적으로 무엇이든 할 수있는 열거자를 위해 제공된 객체를 묻습니다.

다른 팁

컬렉션에 따라 다릅니다.

  • 을 위한 List<T> 삽입 순서로 보장됩니다. (그것은 단지 가정합니다 Add 표시된대로 호출. 특정 장소에서 목록에 요소를 삽입하면 예상되는 올바른 지점에서 반환됩니다.) 기본적으로 복용으로 얻는 것과 동일합니다. list[0], list[1], list[2] 등.
  • 을 위한 Dictionary<TKey, TValue> 보장 된 주문은 없습니다.
  • 을 위한 SortedList<TKey, TValue> (및 마찬가지로) 주요 비교 순서에있을 것입니다. 이것이 유형의 요점입니다.
  • 배열은 항상 요소 순서로 나옵니다.

질문에 구체적으로 답변하려면 "Foreach"는 명령을 반환합니다.getEnumerator() 반환. 목록의 경우 끝에 물건을 추가 한 순서입니다. 사전의 경우 아마도 물건이 할당 된 버킷의 순서 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top