[C#] LINQ之LookUp
聲明:本文為www.cnc6.cn原創,轉載時請註明出處,謝謝!
本文作者文采欠佳,文字表達等方面不是很好,但實際的代碼例子是非常實用的,請作參考。
一、先準備要使用的類:
1、Person類:
class Person { public string Name { set; get; } public int Age { set; get; } public string Gender { set; get; } public override string ToString() => Name; }
2、準備要使用的List,用於查找(ToLookUp,類似分組):
List<Person> personList = new List<Person> { new Person { Name = "P1", Age = 18, Gender = "Male" }, new Person { Name = "P2", Age = 19, Gender = "Male", }, new Person { Name = "P2", Age = 17,Gender = "Female", } };
3、ToLookUp與GroupBy的功能基本一樣,但ToLookUp沒有GroupBy那樣得延遲執行機制,它是立即執行的,且重載只有4個,而GroupBy卻有8個之多。
二、第一種用法:
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(thisIEnumerable<TSource> source, Func<TSource, TKey> keySelector);
官方釋義:根據指定的鍵選擇器函數,從IEnumerable<TSource>創建一個 ILookup<TKey, TSource>。
其實,ToLookUp具有GroupBy一樣的分組功能,我們要LookUp的集合為source,集合內每個元素的類型為TSource,這裏第一個參數keySelector的類型為Func<TSource, TKey>,用於將TSource元素按照由此委托返回的類型TKey進行LookUp,結果為一個已分好組的集合(集合中的集合)。
編寫客戶端試驗代碼如下:
var lookups = personList.ToLookup(p => p.Gender); foreach(var lookup in lookups) { Console.Write($"{lookup.Key}:\t"); foreach(var person in lookup) { Console.Write($"{person.Name},{person.Age}\t"); } Console.WriteLine(); }
以上代碼指定的KeySelector是Person類的Gender屬性,因此,以上會按照Gender(性別)進行LookUp,我們使用兩個嵌套的foreach循環將分組的內容打印到控制臺。
因為lookups返回的類型為ILookUp<TKey,TSource>(實際繼承於IEnumerable<IGrouping<TKey,TSource>>),因此以上返回的類型為ILookUp<string,Person>。
ILookUp<string,Person>是已經LookUp後的集合,內部集合元素為Person,且ILookUp有一個Key屬性,類型為string(指的是Gender屬性類型),用於LookUp的標識。
輸出結果如下:
第二種用法~第四種用法待續。。。
[C#] LINQ之LookUp