user

  1. public class User
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }

*By方法

  • 包括下列方法:

    • DistinctBy: 根据指定的键选择器从集合返回不同元素的集合
    • ExceptBy: 根据指定的键选择器生成两个集合的集合差集
    • IntersectBy: 根据指定的键选择器函数生成两个集合的集合交集
    • UnionBy: 根据指定的键选择器生成两个集合的集合并集
    • MinBy: 根据指定的键选择器函数返回集合中的最小值
    • MaxBy: 根据指定的键选择器函数返回集合中的最大值
  • 相对于不带By的方法,提供了一个键选择器keySelector,允许对值的子集而不是整个值执行操作。

  • 例如,取Name最长的User:

    1. var user = users.MaxBy(p => p.Name.Length);

Chunk

  • 将集合按照提供的大小分为多个集合。也就是说,返回集合的集合。

例如,将用户按10人分组:

  1. var chunks = users.Chunk(size: 10);
  2. foreach (var chunk in chunks)
  3. {
  4. foreach(var user in chunk)
  5. {
  6. Console.WriteLine(user);
  7. }
  8. }

范围和索引支持

  • 范围(..)和索引(^)用于访问集合中的单个元素或范围。

现在可以对ElementAt方法使用索引重载,对Take方法使用范围重载。

示例代码如下:

  1. var lastUser = users.ElementAt(^1);//取最后一个User
  2. var users1To4 = users.Take(1..5);//取索引1到4的User
  3. *OrDefault defaultValue参数
  4. FirstOrDefault, LastOrDefaultSingleOrDefault方法当未找到集合元素时将返回default(T)。
  • 但在某些场合是不合适的。比如需要始终返回一个User实例,避免空引用,这时可以传递defaultValue参数进行指定:
  1. static readonly User EmptyUser = new User { Name = "" };
  2. var user = users.FirstOrDefault(p=>p.Age>30, EmptyUser);
  3. Console.WriteLine(user.Name);

结论

  • 虽然这些改进都很小,没有从根本上改变使用LINQ的方式,但每一项确实都能帮助解决实际项目中的需要。