在最新的 .NET 9 Alpha 版本中,LINQ(语言集成查询)引入了强大的新方法,如 和 ,增强了数据操作的简单性和可读性。这些方法为常见任务提供了一种更直观的方法,例如根据特定键对元素进行计数和聚合,从而降低了复杂性。CountByAggregateBy
在 LINQ 中引入该方法之前,我们必须依靠 和 (或 ) 方法的组合来按键对元素进行分组,然后计算每个组的出现次数。CountByGroupBySelectCount
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
// Define a list of users
var users = new List<User>
{
new User { Name = "Alice", Role = "Admin" },
new User { Name = "Bob", Role = "Member" },
new User { Name = "Charlie", Role = "Admin" },
new User { Name = "David", Role = "Member" },
new User { Name = "Eve", Role = "Guest" },
new User { Name = "Frank", Role = "Admin" }
};
// CountBy Role using GroupBy and Select
var roleCounts = users
.GroupBy(user => user.Role) // Group users by their roles
.Select(group => new { Role = group.Key, Count = group.Count() }); // Select the role and count for each group
// Print the results
foreach (var roleCount in roleCounts)
{
Console.WriteLine($"Role: {roleCount.Role}, Count: {roleCount.Count}");
}
}
}
// User class definition
public class User
{
public string Name { get; set; }
public string Role { get; set; }
// Add more properties if needed
}
虽然这种方法很灵活,但它需要更多的代码。
随着 .NET 9 的引入,可以使用更简洁、更直观的代码实现相同的操作。 通过在内部处理分组和计数来简化过程,直接返回一个集合,其中键是组,值是该组中元素的计数。CountByCountByKeyValuePairs
foreach (var roleCount in users.CountBy(user => user.Role))
{
Console.WriteLine($"There are {roleCount.Value} users with the role {roleCount.Key}");
}
输出将为:
There are 3 users with the role Admin
There are 2 users with the role Member
There are 1 users with the role Guest
我们将向类引入一个新属性,比如说,它是一个整数。然后,我们将按用户角色聚合这些访问级别。UserAccessLevel
在 之前,您通常会使用 with 来完成此任务。AggregateByGroupByAggregate
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
// Define a list of users
var users = new List<User>
{
new User { Name = "Alice", Role = "Admin", AccessLevel = 10 },
new User { Name = "Bob", Role = "Member", AccessLevel = 5 },
new User { Name = "Charlie", Role = "Admin", AccessLevel = 20 },
new User { Name = "David", Role = "Member", AccessLevel = 5 },
new User { Name = "Eve", Role = "Guest", AccessLevel = 1 },
new User { Name = "Frank", Role = "Admin", AccessLevel = 10 }
};
// Aggregate AccessLevel by Role using GroupBy and Aggregate
var accessLevelSumByRole = users
.GroupBy(user => user.Role) // Group users by their roles
.Select(group => new { Role = group.Key, TotalAccessLevel = group.Sum(user => user.AccessLevel) }); // Aggregate AccessLevel for each role
// Print the results
foreach (var roleAggregate in accessLevelSumByRole)
{
Console.WriteLine($"Total AccessLevel for role {roleAggregate.Role} is {roleAggregate.TotalAccessLevel}");
}
}
}
// User class definition
public class User
{
public string Name { get; set; }
public string Role { get; set; }
public int AccessLevel { get; set; }
}
通过引入 ,您可以更简洁地执行相同的操作。AggregateBy
// AggregateBy AccessLevel using AggregateBy
var accessLevelSumByRole = users.AggregateBy(
user => user.Role,
seed: 0,
(currentTotal, user) => currentTotal + user.AccessLevel);
// Print the results
foreach (var roleAggregate in accessLevelSumByRole)
{
Console.WriteLine($"Total AccessLevel for role {roleAggregate.Key} is {roleAggregate.Value}");
}
输出将为:
Total AccessLevel for role Admin is 40
Total AccessLevel for role Member is 10
Total AccessLevel for role Guest is 1
虽然 LINQ 方法(如 )和第三方库(如 )提供了一组丰富的扩展功能,但这些方法正式包含在 .NET 9 Alpha 版本中标志着一个重要的里程碑。它标志着 Microsoft 致力于增强 LINQ 库本身,将这些强大且急需的功能直接集成到核心框架中,确保直接来自 .NET 生态系统的主要维护者的强大支持和优化CountByAggregateBySuperLinq Microsoft + 开源& Microsoft 设计