簡體   English   中英

C# - 獲取數組最后一個非零數的索引

[英]C# - Get the Index of the last non-zero number of an array

我有一組年度結果,我想確定最后一個非零值的索引。 末尾的 0 值是數據提供和讀入方式的產物。0 值可以出現在數據中的任何位置,甚至可能全為 0。

decimal[] results = { 0, 0, 39.59m, -17.83m, 73.52m, 0, 56.80m, -61.54m, 0, 0, 0, 0 }

我已經嘗試了一些事情,但我一直以中間零之前的值索引結束(例如 4,而不是 7)。

這是 LINQ 的答案:

var index = results.Reverse().SkipWhile( x => x == 0 ).Count() - 1
decimal[] results = { 0, 0, 39.59m, -17.83m, 73.52m, 0, 56.80m, -61.54m, 0, 0, 0, 0 };

這種方法使用最少的代碼

var index = Array.FindLastIndex(results, value => value != 0);

這種方法為您提供了價值和索引

var lastIndexAndValue = results
  .Select((value, index) => (index, value))
  .LastOrDefault(item => item.value != 0);

您可以創建一個可以通用處理LastIndexOf功能的擴展方法。

public static class CustomExtensions
{
    public static int LastIndexOf<T>(this T[] input, Func<T, bool> selector) where T : IComparable<T>
    {
        int lastIndex = -1;

        for (int index = 0; index < input.Length; index++)
        {
            if (selector(input[index]))
            {
                lastIndex = index;
            }
        }

        return lastIndex;
    }
}

有了這個,如果索引處的值與條件匹配(即不等於 0),您實際上只是更新lastIndex變量

用法

decimal[] results = { 0, 0, 39.59m, 17.83m, 73.52m, 0, 76.80m, 61.54m, 0, 0, 0, 0 };

int index = results.LastIndexOf(num => num != 0);

// Output is 7

您可能需要使用for循環遍歷數組。 這應該有效:

int LastNonZero = -1;
for (int count = 0; count < results.Length; count++) {
  if (results[count] != 0) // It isn't zero:
  {
    LastNonZero = count;
  }
}

我剛剛對此進行了測試,它返回了 7。

我只想轉換為List並使用linq

var result = results.ToList().LastIndexOf(results.Last(c=> c != 0));

如果您不想轉換為列表。

var index = Array.LastIndexOf(results,results.Last(c=> c != 0));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM