2012-09-13 6 views
13

내 int 배열을 오름차순으로 정렬하고 싶습니다.orderby로 int 배열 정렬

int[] copyArray = myArray.ToArray(); 

가 그럼 난 이런 오름차순으로 정렬하고 싶습니다 : 첫 번째

내 배열의 복사본을 만들

int[] sortedCopy = from element in copyArray 
        orderby element ascending select element; 

을하지만 오류를 얻을됩니다 "선택" 오류가 발생했습니다 : "암시 적으로 'system.linq.iorderedenumerable'유형을 'int []'로 변환 할 수 없습니다."

+0

sortedCopy로 다음 단계는 무엇입니까? 어쩌면 배열이 필요하지 않을 수도 있습니다. – weston

답변

32

끝에 ToArray() 정렬 된 시퀀스를 실제로 배열로 변환합니다. LINQ는 지연 검사을 사용합니다. 즉 ToArray(), ToList() 또는 다른 유사한 방법으로 호출 할 때까지는 중간 처리 (이 경우 정렬)가 수행되지 않습니다.

이렇게하면 이미 요소 사본이 만들어 지므로 실제로 먼저 사본을 직접 만들 필요가 없습니다.

예 :

int[] sortedCopy = (from element in myArray orderby element ascending select element) 
        .ToArray(); 

아마도 표현식 구문이 쓰기 것이 바람직 할 것입니다 :

int[] sortedCopy = myArray.OrderBy(i => i).ToArray(); 
+1

Jon 씨 매우 고마워요! :) "(i => i)"의 의미는 무엇입니까? – user1635406

+9

@ user1635406 :'i => i'는 * 람다 함수 *; 배열을 정렬하는 방법을 설명합니다. 첫 번째'i'는'i'라는 하나의 인수를 취한다는 것을 의미합니다 (유효한 이름을 선택할 수 있음). 이 인수는 배열에 들어 있기 때문에 'int'입니다. 두 번째 부분은 정렬 할 수량입니다.이 경우 각 숫자를 "자체적으로"정렬해야하므로'i => i'입니다. 마크의 대답에서'x => x.Name'은 "각 요소'x'를''x.Name''로 정렬하는 것을 의미합니다." – Jon

+0

배열을 먼저 수행 한 다음 순서를 지정하면 더 빨리 처리되지 않습니까? –

1

우리는 당신이 다음에 무엇을하고 있는지 모르겠지만, 어쩌면 당신이 필요로하지 않습니다 배열. 다른 linq 문이나 foreach 문에 들어간다면 var을 사용하여 그대로 유지하십시오.

var sortedCopy = myArray.OrderBy(i => i); 

foreach(var item in sortedCopy) 
{ 
    //print out for example 
} 

이렇게하면 linq를 가능한 한 게으르게 설정할 수 있습니다. ToArray 또는 ToList을 항상 캐스팅한다면, 그때와 그곳을 평가하고 결과를 위해 메모리를 할당하는 것보다 더한 선택의 여지가 없습니다.

14

참고 :이 사본이 필요하지 않은 경우 (즉, myArray을 변경 가능), 다음 훨씬 더 간단하고 효율적인 방법은 그냥 :

Array.Sort(myArray); 

이의 적절한 정렬을한다 가능한 한 효율적으로 배열된다는 사실을 이용하여 배열을 만듭니다.

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray(); 
:이의 도덕적 동등

Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name)); 

: 더 복잡한 시나리오

(예를 들어, 객체 배열의 멤버 현명한 종류), 당신은 같은 일을 할 수

하지만 다시 : 정렬 작업을 수행합니다.

+0

고맙습니다.하지만 이번에는 사본이 필요했습니다. Intresting 독서. :) – user1635406