在陣列中查詢元素
在陣列中查詢元素
陣列操作基本上都是由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類提供了三個方法用於查詢元素,它們分別是:
- Find方法:查詢符合條件的元素,如果找到,就不再往下查詢;如果沒有找到滿足條件的元素,則返回型別的預設值。例如,如果要查詢的目標型別是int,在找不到符合條件的元素時就返回int的預設值0。
- FindLast方法:查詢滿足條件的元素,並返回符合條件的最後一個元素,和FindLastIndex方法類似。例如,一個整形陣列包含1、2、3、4四個元素,如果查詢的條件是小於4的元素,那麼符合條件的元素有1、2、3三個,FindLast方法將返回最後匹配的元素,即返回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