2011-12-28 2 views
3

int[] num = {1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1};LINQ 쿼리 시작과 끝 지수와

가 어떻게 최대 값을 얻기 위해 LINQ를 사용합니까 최대 값의 인덱스와 인덱스 3, 인덱스 (8) 사이의 최대 값의 인덱스 사이의 최대 값을 선택하는 방법 ?

+1

중복 http://stackoverflow.com/questions/8661097/linq-query-how-to-select-max-value-between-start-and-end-index – Adam

+0

아니, 그 질문은이다 최대 값을 얻으려면 배열의 최대 값 인덱스를 얻으려고합니다. –

+0

이 질문에 귀하의 다른 질문과 거의 동일한 텍스트가 포함되어 있습니다. 여기에있는 철학은 * 직접 시도하고, 시도한 것과 인터넷 연구가 무엇인지 생각 해보고 예제를 게시 한 다음 문제를 자세하게 설명하는 것입니다. 나는 연구 노력을하지 않는다. – Adam

답변

3

당신은 사용할 수 있습니다

var info = num.Select((i, ind) => new {Value=i, Index=ind}).Skip(3).Take(6) 
       .OrderByDescending(p => p.Value).First(); 

Console.WriteLine("Value {0} at Index {1}", info.Value, info.Index); 

또한 Aggregate을 사용할 수

var info = num.Select((i, ind) => new {Value=i, Index=ind}).Skip(3).Take(6) 
       .Aggregate((a, b) => b.Value > a.Value ? b : a); 

이 단순화 될 수있다 당신이 조금 더 좋은 뭔가 MoreLinq's MaxBy() 또는 유사한 루틴을 사용하는 경우 :

var info = num.Select((i, ind) => {Value=i, Index=ind}).Skip(3).Take(6) 
       .MaxBy(p => p.Value); 
+0

당신의 도움에 감사드립니다 –

+0

'.OrderByDescending (...). First()'보다'.Aggregate ((a, p) => (a.Value> p.Value)를 사용할 수 있습니까? '. [Aggregate는 이러한 유형의 시나리오를위한 것입니다.] (http://msdn.microsoft.com/en-us/library/bb548651.aspx) –

+0

@ScottRippey : 좋은 지적 - 추가 할 것입니다. –

0

시험해보십시오. 단일 쿼리가 아니지만 도움이 될 수 있습니다.

var max = num.Skip(3).Take(4).Max(); 
var indexOfItem = num.Skip(3).Take(4).First(t => t.Equals(max)); // this is not correct, returns the value not the index. 
+0

도움을 주셔서 감사합니다 –

+0

두 가지 : 필요한 요소 수를 얻으려면 4 이상 (6을 포함하여 6 포함)을 가져야합니다. 둘째로, 'First'는 아이템의 인덱스가 아니라 아이템을 반환 할 것입니다. 위의 코드는 9,8이 아니라 Take (6)를 반환합니다. –

+0

아, 첫 번째 점에 좋은 점(). –

관련 문제