在C#中,List<T>(以及任何實現了IEnumerable<T>的集合)的Select和SelectMany擴展方法都是LINQ(Language Integrated Query)的一部分,用于對集合中的元素進行查詢和轉換。
盡管它們的作用有些相似,但它們在處理集合時的方式和結果上有顯著的區別。
Select
Select方法用于將集合中的每個元素投影(或轉換)為一個新的形式。
它不會改變集合中元素的數量,只是改變了每個元素的表現形式。
每個輸入元素都會被轉換成一個輸出元素,因此輸出集合的長度與輸入集合相同。
//假設我們有一個List<int>,我們想要將其中的每個整數乘以2。
List<int> numbers = new List<int> { 1, 2, 3 }; ?var doubledNumbers = numbers.Select(n => n * 2); ?
// doubledNumbers 的類型是 IEnumerable<int>,包含 { 2, 4, 6 }
SelectMany
?
SelectMany方法用于將一個集合中的每個元素都轉換成一個集合,然后將所有這些子集合合并成一個單獨的集合。
這意味著,如果每個輸入元素都被轉換成一個包含多個元素的集合,那么輸出集合的長度將是所有這些子集合中元素的總數。
?
//假設我們有一個List<int[]>,我們想要將所有數組中的整數合并成一個單獨的List<int> List<int[]> arrays = new List<int[]> {new int[] { 1, 2 },new int[] { 3, 4 }, new int[] { 5 }};var flattenedList = arrays.SelectMany(arr => arr);// flattenedList 的類型是 IEnumerable<int>,包含 { 1, 2, 3, 4, 5 }//在這個例子中,每個int[] 都被轉換成了它的單個元素,然后這些元素被合并成了一個單獨的IEnumerable<int>。
總結
Select:將集合中的每個元素轉換為新的形式,不改變元素數量。
SelectMany:將集合中的每個元素轉換為一個集合,然后將這些集合合并成一個單獨的集合,可能會改變元素數量(通常是增加)。