English 中文(简体)
C# arrays: finding custom minimal element
原标题:

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.

问题回答

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.

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)

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();

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.

don t forget about the SortedList Class





相关问题
Manually implementing high performance algorithms in .NET

As a learning experience I recently tried implementing Quicksort with 3 way partitioning in C#. Apart from needing to add an extra range check on the left/right variables before the recursive call, ...

Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

How do I compare two decimals to 10 decimal places?

I m using decimal type (.net), and I want to see if two numbers are equal. But I only want to be accurate to 10 decimal places. For example take these three numbers. I want them all to be equal. 0....

Exception practices when creating a SynchronizationContext?

I m creating an STA version of the SynchronizationContext for use in Windows Workflow 4.0. I m wondering what to do about exceptions when Post-ing callbacks. The SynchronizationContext can be used ...

Show running instance in single instance application

I am building an application with C#. I managed to turn this into a single instance application by checking if the same process is already running. Process[] pname = Process.GetProcessesByName("...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...

热门标签