数组中多个最大值的索引

时间:2019-03-06 14:25:15

标签: c# .net

我有一个例如

的数组
SELECT * 
FROM   similarity_values 
WHERE  ( SELECT 200 ) IN 
          ( SELECT id 
            FROM unnest( assemblies ) AS id )

问题在于从数组获取多个最大值的索引。

6 个答案:

答案 0 :(得分:3)

首先获得最大值:

int max = array.Max();

现在获取具有该值的元素的索引:

var indices = array.Select((x, i) => new { Index = i, Value = x })
    .Where(x => x.Value == max)
    .Select(x => x.Index);

答案 1 :(得分:2)

这是您一次完成此操作的方法。

var indices = new List<int>();
int max = int.MinValue;
for(int i = 0; i < array.Length; i++)
{
    if(array[i] > max)
    {
        max = array[i];
        indices.Clear();
    }

    if(array[i] == max)
    {
        indices.Add(i);
    }
}

基本上,您可以跟踪最大值和索引列表。当看到大于最大值的值时,请将其设置为max并清除列表,因为其中的任何索引都不再指向最大值。然后只需检查该值是否等于最大值,然后将索引添加到列表中即可。

答案 2 :(得分:1)

使用扩展方法,假设您已经具有要查找的maxValue:

public static IEnumerable<int> AllIndexesOf(this List<T> list, T searchValue)
{
    int minIndex = list.IndexOf(searchValue);
    while (minIndex != -1)
    {
        yield return minIndex;
        minIndex = list.IndexOf(searchValue, minIndex + 1);
    }
}

您可以拥有:

int[] array = new int[] {1, 3, 2, 3};
int maxValue = array.Max(); 
int[] indexesOfMax = array.AllIndexesOf(maxValue).ToArray();

答案 3 :(得分:1)

Linq方法

int[] array = new int[] { 1, 3, 2, 3 };

int[] result = array.Select((x, i) => new { index = i, value = x })
                    .GroupBy(x => x.value)
                    .OrderByDescending(x => x.Key)
                    .First()
                    .Select(x => x.index)
                    .ToArray();

答案 4 :(得分:0)

与@HimBromBeere的回答相反

我们可以为每个唯一数字使用字典,然后为它显示的每个索引使用整数列表。

var intArray = new int[5];
var dictionary = new Dictionary<int, List<int>>();
for (int i = 0; i < intArray.Length; i++)
{
    var num = intArray[i];
    if (!dictionary.ContainsKey(num))
     {
        dictionary.Add(num, new List<int>());
     }

     dictionary[num].Add(i);
}

var max = dictionary.Keys.Max();
return dictionary[max];

总体操作较少,但更简洁。

答案 5 :(得分:0)

使用yield return并遍历数组可以执行以下操作:

using Linq;
using System.Collections.Generic;

public static class IEnumerableExtensions
{
    // Extension method for IEnumerable
    public static IEnumerable<int> AllIndexesOf<T>(this IEnumerable<T> list, T searchValue)
    {
        for (int i = 0; i < list.Count(); i++)
        {
            if (list.ElementAt(i) == searchValue)
            {
                yield return i;
            }
        }
    }
}

然后使用LINQ在数组中找到最大值并调用方法:

using Linq; // include this at the top of your file, if not already present.

// ...

int[] array = new int[] {1, 3, 2, 3};

IEnumerable<int> matchingIndexes = array.AllIndexesOf(array.Max());

// Convert to array if you need one
int[] matchingIndexesArr = matchingIndexes.ToArray();

您可以找到有关扩展方法in the docs的更多信息。