[c#] C #에서 가장 높은 배열 값 및 인덱스 찾기

그래서 정렬되지 않은 숫자 배열이 int[] anArray = { 1, 5, 2, 7 };있고 배열 에서 가장 큰 값인 7과 3의 값과 인덱스를 모두 가져와야합니다. 어떻게해야합니까?



답변

이것은 가장 매력적인 방법은 아니지만 작동합니다.

(필수 using System.Linq;)

 int maxValue = anArray.Max();
 int maxIndex = anArray.ToList().IndexOf(maxValue);


답변

int[] anArray = { 1, 5, 2, 7 };
// Finding max
int m = anArray.Max();

// Positioning max
int p = Array.IndexOf(anArray, m);


답변

인덱스가 정렬되지 않은 경우 배열을 한 번 이상 반복하여 가장 높은 값을 찾아야합니다. 간단한 for루프를 사용합니다 .

int? maxVal = null; //nullable so this works even if you have all super-low negatives
int index = -1;
for (int i = 0; i < anArray.Length; i++)
{
  int thisNum = anArray[i];
  if (!maxVal.HasValue || thisNum > maxVal.Value)
  {
    maxVal = thisNum;
    index = i;
  }
}

이것은 LINQ 또는 다른 단선 솔루션을 사용하는 것보다 더 장황하지만 아마도 조금 더 빠를 것입니다. O (N)보다 빠르게 만들 수있는 방법은 없습니다.


답변

필수 LINQ one [1] -liner :

var max = anArray.Select((value, index) => new {value, index})
                 .OrderByDescending(vi => vi.value)
                 .First();

(정렬은 아마도 다른 솔루션에 비해 성능 저하 일 것입니다.)

[1] : 주어진 값 “1”에 대해.


답변

간결한 한 줄 :

var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();

테스트 케이스 :

var anArray = new int[] { 1, 5, 2, 7 };
var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();
Console.WriteLine($"Maximum number = {max.Number}, on index {max.Index}.");
// Maximum number = 7, on index 4.

풍모:

  • Linq를 사용합니다 (바닐라만큼 최적화되지는 않았지만 절충안은 코드가 적습니다).
  • 정렬 할 필요가 없습니다.
  • 계산 복잡성 : O (n).
  • 공간 복잡성 : O (n).

비고 :

  • 튜플 정렬은 왼쪽에서 오른쪽으로 튜플 항목을 비교하여 수행되므로 숫자 (인덱스가 아님)가 튜플의 첫 번째 요소인지 확인하십시오.


답변

두 가지 접근 방식이 있습니다. 배열이 비어있을 때 처리를 추가 할 수 있습니다.

public static void FindMax()
{
    // Advantages: 
    // * Functional approach
    // * Compact code
    // Cons: 
    // * We are indexing into the array twice at each step
    // * The Range and IEnumerable add a bit of overhead
    // * Many people will find this code harder to understand

    int[] array = { 1, 5, 2, 7 };

    int maxIndex = Enumerable.Range(0, array.Length).Aggregate((max, i) => array[max] > array[i] ? max : i);
    int maxInt = array[maxIndex];

    Console.WriteLine($"Maximum int {maxInt} is found at index {maxIndex}");
}

public static void FindMax2()
{
    // Advantages: 
    // * Near-optimal performance

    int[] array = { 1, 5, 2, 7 };
    int maxIndex = -1;
    int maxInt = Int32.MinValue;

    // Modern C# compilers optimize the case where we put array.Length in the condition
    for (int i = 0; i < array.Length; i++)
    {
        int value = array[i];
        if (value > maxInt)
        {
            maxInt = value;
            maxIndex = i;
        }
    }

    Console.WriteLine($"Maximum int {maxInt} is found at index {maxIndex}");
}


답변

anArray.Select((n, i) => new { Value = n, Index = i })
    .Where(s => s.Value == anArray.Max());