在我的数组中查找最小元素时,如何指定自定义代码进行比较?
例如,我有两个数组:
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;
}
}
minimumIndex 将包含最后的最小比率的索引。
使用 linq 获取最小值和索引,您可以查看以下答案:
使用 Jon Skeet 扩展方法,您可以编写
var result = Enumerable.Range(0,a.Length)
.Select(i => new {Value = a[i]/b[i], Index = i})
.MinBy(r => r.Value);
(你必须注意 b 中的 0)
您可以使用 linq 将两个序列“压缩”在一起,按比例对它们进行排序并选择第一个索引:
a.Select((item, index) => {new { A = item, B = b[index], Idx = index })
.OrderBy(i => (double)i.A / i.B)
.Select(i => i.Idx)
.First();
不要忘记SortedList 类
使用 linq 你可以这样做:
int customMin = a.Select((v, i) => new { a = v, b = b[i] })
.Select(x => x.a / x.b)
.Min();
第一个选择将两个列表合并为 on,第二个选择计算您的自定义 mertic,然后我们调用 min 来获得最小值。