1. 程式人生 > 其它 >在陣列中查詢元素

在陣列中查詢元素

技術標籤:C#C#在陣列中查詢元素

在陣列中查詢元素


陣列操作基本上都是由Array類來負責,因而該類也提供了一系列方法來用於在陣列中進行查詢。這些方法按照查詢結果劃分,大體可以分為兩類,下面將分別介紹。

1. 查詢元素的索引

此種查詢方式將返回被查詢到的元素的索引,如果未找到,就返回-1。有兩種方法可用:第一組是按照單個元素值來查詢;第二組方法則比較靈活,可以通過System.Predicate委託來自定義查詢過程。如下:
第一組:

  • IndexOf() —— 查詢指定元素的索引,只要遇到符合條件的元素就停止查詢。如果陣列存在多個相同的元素,那麼方法只返回第一個滿足條件的元素的索引。例如,一個數組中有2、2、3、5四個元素,查詢元素2,只返回第一個2的索引,第二個2將被忽略。
  • LastIndexOf() —— 與IndexOf()方法相似,但LastIndexOf方法返回匹配的最後一個元素的索引。例如一個數組中包含a、b、c、c、d五個元素,在查詢元素c時,只返回第二個c的索引。

第二組:

  • FindIndex —— 與IndexOf方法相似,只是可以使用Predicate委託來自定義查詢方式,方法會把每個元素傳給該委託,如果元素符合查詢條件,則返回true,否則返回false。同樣,FindIndex方法一旦找到第一個符合條件的元素就停止查詢。
  • FindLastIndex —— 通過Predicate委託來自定義查詢,返回匹配查詢條件的最後一個元素的索引。

在上面方法的引數中涉及Predicate委託,它的定義原型如下:

    public delegate bool Predicate<in T>(T obj);

T是型別引數,該委託接受以T型別作為引數,並返回bool型別的方法,obj是陣列中待查詢的元素,如果obj符合查詢條件,就返回true,否則就返回false。
下面用一個示例演示如何使用上面所列出的方法來查詢元素的索引。
首先,宣告一個數組變數,用於做測試。

            //用於測試的陣列
            string[] testArr = new string[]
            {
                "ask",
                "check"
, "ask", "food", "ink" };

陣列中包含五個string型別的元素。隨後分別用IndexOf、LastIndexOf、FindIndex和FindLastIndex四個方法來對測試陣列進行查詢,並在螢幕上輸出查詢到的索引。

            //check是陣列的第二個元素,索引為1
            int index1 = Array.IndexOf(testArr,"check");
            System.Console.WriteLine($"check元素的索引:{index1}");

            //陣列中存在兩個ask,索引分別為0和2
            //LastIndexOf方法只返回最後一個ask的索引2
            int index2 = Array.LastIndexOf(testArr,"ask");
            System.Console.WriteLine($"測試陣列中有兩個ask元素,LastIndexOf方法返回的索引:{index2}");

            //通過自定義方式,查詢以k結尾的元素
            //第一個元素ask就是k結尾,已滿足條件,不再往下查詢
            //因此返回第一個ask的索引0
            int index3 = Array.FindIndex(testArr,new Predicate<string>(FindProc));
            System.Console.WriteLine($"FindIndex方法查詢以k結尾的元素的索引:{index3}");

            //自定義方式查詢以k結尾的元素
            //測試陣列中索引0、1、2、3、4四處的元素都以k結尾
            //但FindLastIndex只返回最後一個匹配項ink的索引4
            int index4 = Array.FindLastIndex(testArr,FindProc);
            System.Console.WriteLine($"FindLastIndex方法查詢以k結尾的元素的索引:{index4}");

"check"是陣列的第二個元素,索引為1,故index1的值為1;測試陣列中有兩個"ask"元素,分別是第一個和第三個,LastIndexOf方法返回匹配的最後一項的索引,雖然索引0和2處都找到"ask"元素,但是由於索引2處是最後一處,故index2變數的值為2;在測試陣列中有四個元素是k結尾的,但FindIndex只返回第一個匹配項的索引,因為第一個元素"ask"就是以k結尾的,符合條件,所以index3的值為0;FindLastIndex方法返回最後一個以k結尾的元素"ink"的索引,所以index4變數的值為4。
下面的程式碼是自定義查詢方式的FindProc方法的處理過程。

        private static bool FindProc(string obj)
        {
            if (obj.EndsWith("k"))
            {
                return true;
            }
            return false;
        }

執行結果如下:

check元素的索引:1
測試陣列中有兩個ask元素,LastIndexOf方法返回的索引:2
FindIndex方法查詢以k結尾的元素的索引:0
FindLastIndex方法查詢以k結尾的元素的索引:4

2. 查詢元素自身

這種查詢方式的結果不是返回元素在陣列中的索引,而是直接返回元素自身,也就是返回所找到的元素的值。Array類提供了三個方法用於查詢元素,它們分別是:

  1. Find方法:查詢符合條件的元素,如果找到,就不再往下查詢;如果沒有找到滿足條件的元素,則返回型別的預設值。例如,如果要查詢的目標型別是int,在找不到符合條件的元素時就返回int的預設值0。
  2. FindLast方法:查詢滿足條件的元素,並返回符合條件的最後一個元素,和FindLastIndex方法類似。例如,一個整形陣列包含1、2、3、4四個元素,如果查詢的條件是小於4的元素,那麼符合條件的元素有1、2、3三個,FindLast方法將返回最後匹配的元素,即返回3。
  3. FindAll方法:按照指定的條件進行查詢,返回所有符合條件的元素,以陣列的形式返回。例如,一個int陣列包含1、2、3、4四個元素,查詢條件為小於3的元素,則FindAll方法將返回一個新的int陣列,該陣列包含符合條件的兩個元素1和2。

示例如下:
定義一個int陣列:

            //宣告陣列變數
            int[] arr = {3,6,35,10,9,13};

分別使用Find、FindLast和FindAll三個方法在陣列中查詢小於10的元素,並輸出查詢結果。

            //Find方法只返回匹配的第一個元素
            //陣列中第一個小於10的元素是3,故返回3
            int result = Array.Find(arr,new Predicate<int>(FindCallback));
            System.Console.WriteLine($"Find方法查詢小於10的元素:{result}");

            //FindLast方法返回匹配元素的最後一項
            //陣列中最後一個小於10的元素是9,故返回9
            int result2 = Array.FindLast(arr,FindCallback);
            System.Console.WriteLine($"FindLast方法查詢小10的元素:{result2}");

            //FindAll方法返回所有匹配的元素
            //陣列中3,6,9都小於10
            //因此,返回一個由3、6、9三個元素組成的陣列
            int[] result3 = Array.FindAll(arr,FindCallback);
            System.Console.WriteLine("FindAll方法查詢所有小於10的元素:");
            foreach(int x in result3)
            {
                Console.Write(x+" ");
            }

陣列中小於10的有三個元素:3、6、9。Find方法只返回第一個符合條件的元素,所以返回3;FindLast方法返回符合條件的最後一個元素,所以返回9;FindAll方法返回所有符合條件的元素,因此返回3、6、9。
FindCallback方法的定義如下,用於Predicate委託。如果元素小於10則返回true,否則返回false。

        private static bool FindCallback(int val)
        {
            if(val < 10)
            {
                return true;
            }
            return false;
        }

示例執行結果如下:

Find方法查詢小於10的元素:3
FindLast方法查詢小10的元素:9
FindAll方法查詢所有小於10的元素:
3 6 9