2011-12-28 32 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)?a:p) '。 [聚合是專門爲這些類型的場景。](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包括8)。其次,'First'將返回項目,而不是項目的索引...上面的代碼將返回9,9,而不是9,8(Take(6))。 –

+0

啊,先說好點()。 –

相關問題