Reputation: 113
How do I specify a custom code for comparison when finding a minimal element in my Array?
For example, I have two arrays:
int[] a = new int[] {3, 6, 8};
int[] b = new int[] {9, -2, 5};
I want to figure out, what would be the minimal ratio of the elements with respective indexes (i.e. find minimum of 3/9
, 6/(-2)
and 8/5
) and then return the index. I'm already aware of Array.Min(), but I wonder if it's possible to make any sort of it's customization.
Upvotes: 2
Views: 848
Reputation: 144136
You could use linq to 'zip' the two sequences together, order them by their ratio and select the first index:
a.Select((item, index) => {new { A = item, B = b[index], Idx = index })
.OrderBy(i => (double)i.A / i.B)
.Select(i => i.Idx)
.First();
Upvotes: 2
Reputation: 5994
Using linq to get the minimal value AND the index, you could look at this answer:
How to use LINQ to select object with minimum or maximum property value
Using Jon Skeet extension method, you could then write
var result = Enumerable.Range(0,a.Length)
.Select(i => new {Value = a[i]/b[i], Index = i})
.MinBy(r => r.Value);
(you'll have to watch out for 0's in b)
Upvotes: 3
Reputation: 12499
Perhaps something like this:
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 will contain the index of the smallest ratio at the end.
Upvotes: 3
Reputation: 2897
with linq you could do this:
int customMin = a.Select((v, i) => new { a = v, b = b[i] })
.Select(x => x.a / x.b)
.Min();
the first select merges the two lists into on, the second select calculates your custom mertic, then we call min to get the minimum.
Upvotes: 0