2009-11-27 44 views
2

在我的數組中找到最小元素時,如何指定自定義代碼進行比較?C#數組:查找自定義最小元素

例如,我有兩個陣列:

int[] a = new int[] {3, 6, 8}; 
int[] b = new int[] {9, -2, 5}; 

我想弄清楚,這將是與相應的索引的元素的最小比(即發現的3/96/(-2)8/5最小),然後返回索引。我已經知道Array.Min(),但我想知道是否有可能進行任何類型的定製。

回答

3

也許是這樣的:

double smallest = double.MaxValue; 
int smallestIndex = 0; 

for (int i = 0; i < (a.Length > b.Length ? b.Length : a.Length); i++) 
{ 
    if ((double)a[i]/b[i] < smallest) 
    { 
     smallest = (double)a[i]/b[i]; 
     smallestIndex = i; 
    } 
} 

smallestIndex將包含比值最小的指數在年底。

0

使用LINQ,你可以這樣做:

  int customMin = a.Select((v, i) => new { a = v, b = b[i] }) 
       .Select(x => x.a/x.b) 
       .Min(); 

的第一選擇合併兩個列表插入, 第二選擇計算您的自定義mertic, 則稱分鐘得到最低限度。

+0

您的解決方案並不能產生索引。 – 2009-11-27 10:29:35

3

使用LINQ to得到最小值和索引,你可以看看這個答案:

How to use LINQ to select object with minimum or maximum property value

使用喬恩斯基特擴展方法,然後你可以寫

var result = Enumerable.Range(0,a.Length) 
    .Select(i => new {Value = a[i]/b[i], Index = i}) 
    .MinBy(r => r.Value); 

(你必須注意b中的0)

+0

這是LINQ,但Andy的回答更直接,如果不是那麼美觀愉快。 – 2009-11-27 10:35:07

+0

+1用於在LINQ中提供答案,並確認LINQ並不總是最直接的。另外,好的工作注意到潛在的div爲0.我沒有看到這一點。 – 2009-11-27 10:42:29

2

您可以使用linq將兩個序列'壓縮'在一起,按比例排序並選擇第一個ind例如:

a.Select((item, index) => {new { A = item, B = b[index], Idx = index }) 
    .OrderBy(i => (double)i.A/i.B) 
    .Select(i => i.Idx) 
    .First(); 
+0

+1爲了優雅。它在O(n Log n)中。 – 2009-11-27 10:50:04

+1

是的,我建議Andy的回答,但我認爲這也相當不錯 – Lee 2009-11-27 10:56:32

相關問題