📜  LINQ ToLookup()方法(1)

📅  最后修改于: 2023-12-03 15:17:19.816000             🧑  作者: Mango

LINQ ToLookup()方法

在LINQ中,我们可以使用ToLookup()方法将序列分组为多个序列,每个序列都按照指定键的值进行分组。

语法
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);

ToLookup()方法有两个重载方法:

  1. 接受一个键选择器函数,将序列按照键选择器函数返回的键值进行分组。返回一个ILookup<TKey, TSource>类型的对象,其中TKey为键的数据类型,TSource为序列的数据类型。

  2. 接受一个键选择器函数和一个元素选择器函数,将序列按照键选择器函数返回的键值进行分组,并将元素选择器函数返回的元素添加到对应的键的值序列中。返回一个ILookup<TKey, TElement>类型的对象,其中TKey为键的数据类型,TElement为元素的数据类型。

示例
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
ILookup<int, int> lookup = nums.ToLookup(n => n % 2);
foreach (var g in lookup)
{
    Console.WriteLine("Key: " + g.Key);
    Console.WriteLine("Values: " + string.Join(",", g.ToArray()));
}

上面的代码将int类型的数组nums按照元素模2的值进行分组,返回了一个ILookup<int, int>类型的对象lookup。通过foreach循环遍历lookup对象,分别输出了每个键的值以及对应的序列。

输出结果:

Key: 1
Values: 1,3,5,7,9
Key: 0
Values: 2,4,6,8
注意事项
  • ToLookup()方法返回的对象是一个只读的集合,不能修改其中的值。
  • 当序列中存在null元素时,ToLookup()方法会抛出ArgumentNullException异常。
  • 当序列中存在重复的键时,分组后的序列中会包含相同键的值。