2017-07-08 93 views
0

迭代集合的缺點是否有一種方法可以返回具有最高絕對值的集合中的double而不將值設置爲該集合其實絕對?從列表中返回具有最高絕對值的double值,但不使返回值絕對

double[] vals = new double[] { 2.3, 1.7, -3.8}; 

vals.Max(v => Math.Abs(v)); // This returns 3.8 instead of -3.8 
+0

「迭代集合」。 Enumerable.Max迭代一個集合。老的好'for'循環將是最高性能的解決方案 – ASh

+0

@ASh AFAIK原生.net迭代在'for'循環中有一個性能提升,這裏有一個性能問題,我沒有提及並且想知道是否存在在我編寫自己的'IEnumerable'擴展的路線之前的某種本地實現。 – Wobbles

+1

什麼是'native .net iteration' @Wobbles? – mjwills

回答

3

一種方法來考慮:

var max = vals 
    .OrderByDescending(z => Math.Abs(z)) 
    .FirstOrDefault(); 

或者,考慮使用MoreLinq的MaxBy。它比我和Samvel的解決方案都要快,特別是對於更大的輸入集。

var max = vals.MaxBy(z => Math.Abs(z)); 
1

以下是這樣做的方法有兩種:

先用LINQ

double[] vals = new double[] { 2.3, 1.7, -3.8}; 
var max = vals.Max(x => Math.Abs(x)); 
Console.WriteLine(vals.Where(z => Math.Abs(z) == max).First()); 

第二,For循環:

int index =0; 
for(int i=0;i<vals.Length;i++) 
{ 
    if(Math.Abs(vals[i])>=Math.Abs(vals[index])) 
     index=i; 
} 
Console.WriteLine(vals[index]); 
+0

Ahh一些黃金linq功夫 – Wobbles

+1

有'vals.Max' **內** 「Where」子句將意味着輸入迭代的次數超出您的預期。你會想把它移到'Where'子句之外(但是事先檢查'vals.Any()'是否爲真,否則'Max'將拋出一個異常)。 – mjwills

+0

@mjwills它是迭代2次,因爲如果你首先選擇所有anonymouse類型,它也不會拋出異常,因爲總是存在我們認爲是max的元素 –