在我的數組中找到最小元素時,如何指定自定義代碼進行比較?C#數組:查找自定義最小元素
例如,我有兩個陣列:
int[] a = new int[] {3, 6, 8};
int[] b = new int[] {9, -2, 5};
我想弄清楚,這將是與相應的索引的元素的最小比(即發現的3/9
,6/(-2)
和8/5
最小),然後返回索引。我已經知道Array.Min(),但我想知道是否有可能進行任何類型的定製。
在我的數組中找到最小元素時,如何指定自定義代碼進行比較?C#數組:查找自定義最小元素
例如,我有兩個陣列:
int[] a = new int[] {3, 6, 8};
int[] b = new int[] {9, -2, 5};
我想弄清楚,這將是與相應的索引的元素的最小比(即發現的3/9
,6/(-2)
和8/5
最小),然後返回索引。我已經知道Array.Min(),但我想知道是否有可能進行任何類型的定製。
也許是這樣的:
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將包含比值最小的指數在年底。
使用LINQ,你可以這樣做:
int customMin = a.Select((v, i) => new { a = v, b = b[i] })
.Select(x => x.a/x.b)
.Min();
的第一選擇合併兩個列表插入, 第二選擇計算您的自定義mertic, 則稱分鐘得到最低限度。
使用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)
這是LINQ,但Andy的回答更直接,如果不是那麼美觀愉快。 – 2009-11-27 10:35:07
+1用於在LINQ中提供答案,並確認LINQ並不總是最直接的。另外,好的工作注意到潛在的div爲0.我沒有看到這一點。 – 2009-11-27 10:42:29
您可以使用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();
+1爲了優雅。它在O(n Log n)中。 – 2009-11-27 10:50:04
是的,我建議Andy的回答,但我認爲這也相當不錯 – Lee 2009-11-27 10:56:32
不要忘了SortedList Class
您的解決方案並不能產生索引。 – 2009-11-27 10:29:35