我有一个例如
的数组SELECT *
FROM similarity_values
WHERE ( SELECT 200 ) IN
( SELECT id
FROM unnest( assemblies ) AS id )
问题在于从数组获取多个最大值的索引。
答案 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的更多信息。