自從 .Net 有 LINQ 的時候,List 搜尋不使用回圈來撰寫,原本好幾行的程式碼可以精簡化到只剩一行就可以解決並且效能非常的優異,如果你還在使用回圈來搜尋資料的話來看看如何運用 LINQ 來搜尋 List 中資料吧!
-程式碼
舉例來說,我這邊有一個類別叫做 PersonData,並且宣告一個 PersonDataList,內容如下
public class PersonData
{
public int ID { get; set; }
public string Name { get; set; }
}
List<PersonData> PersonDataList = new List<PersonData>();
PersonDataList.Add(new PersonData { ID = 1, Name = "Peter" });
PersonDataList.Add(new PersonData { ID = 2, Name = "Harry" });
PersonDataList.Add(new PersonData { ID = 3, Name = "Tom" });
PersonDataList.Add(new PersonData { ID = 4, Name = "Allen" });
PersonDataList.Add(new PersonData { ID = 5, Name = "Andy" });
這邊要用到 LINQ 來搜尋的話就需要使用到 Lambda 運算式,以下範例說明:
Exists :: 搜尋 List 中是否有符合條件
//IsExists == true
bool IsExists = PersonDataList.Exists(x => x.Name.Equals("Peter"));
//IsExists == false
bool IsExists = PersonDataList.Exists(x => x.Name.Equals("Kacter"));
Find :: 搜尋 List 中第一個有符合條件的值
//PersonData == PersonDataList[2]
PersonData PersonData = PersonDataList.Find(x => x.Name.Equals("Tom"));
//PersonData == PersonDataList[3]
PersonData PersonData = PersonDataList.Find(x => x.Name.Contains("A"));
FindAll :: 搜尋 List 中所有符合條件的值
//NewPersonDataList == PersonDataList[2]
List<PersonData> NewPersonDataList = PersonDataList.FindAll(x => x.Name.Equals("Tom"));
//NewPersonDataList == PersonDataList[3,4]
List<PersonData> NewPersonDataList = PersonDataList.FindAll(x => x.Name.Contains("A"));
FindIndex :: 搜尋 List 中第一個符合條件的值的 index,找不到回傳
//PersonIndex == 2
int PersonIndex = PersonDataList.FindIndex(x => x.Name.Equals("Tom"));
//PersonIndex == 3
int PersonIndex = PersonDataList.FindIndex(x => x.Name.Contains("A"));
-結語
LINQ 與回圈搜尋整體效能真的差異非常多,之前我有一個好幾萬的 string 在 List<string> 裡面,當時原本是使用回圈去撰寫搜尋,整體跑完要好幾分鐘。改用 LINQ 之後只需要不到一秒就可以完成,整個效能大提升,非常建議要學起來,非常好用!