c# - 集合的一个字段上的模式匹配

标签 c# collections properties pattern-matching field

假设我有一个名为 car 的类,如下所示:

        public class Car
        {
            public int Id { get; set; }

            public State State { get; set; }
        }

        public abstract record State(DateTime UpdatedAt)
        {
            protected State() : this(DateTime.UtcNow)
            {
            }
        }

        public record New : State;

        public record Damaged(int DamagedParts, string Description) : State;

我从数据库中获取了状态损坏的汽车列表。它是一个 IReadOnlyCollection。如何在不迭代列表的情况下轻松获取 DamagedState 的属性(损坏的部件和描述)?我可以为此使用模式匹配吗?

获取的汽车数量最多可达 50k。

最佳答案

如果不迭代列表就无法执行此操作。您不必使用 LINQ 显式迭代,但 LINQ 会在内部进行迭代。

由于您的汽车列表仅包含状态为 Damaged 的汽车,我们不需要 Where子句:

List<(int CarId, int DamagedParts, string Description)> damaged = cars
    .Select(c => 
      (CarId: c.Id, ((Damaged)c.State).DamagedParts, ((Damaged)c.State).Description))
    .ToList();

这将返回包含所需信息的元组列表。

或者,更简单:

List<(int CarId, Damaged Damage)> damaged = cars
    .Select(c => (CarId: c.Id, Damage: (Damaged)c.State))
    .ToList();

您还可以推迟执行而不调用 .ToList() 。这将返回 IEnumerable<T>这将迭代原始汽车列表,而不将其存储在新集合中。

我不明白模式匹配在这种情况下有何帮助。

如果您希望能够通过汽车 ID 快速选择损坏:

Dictionary<int, Damaged> damageDict = cars
    .ToDictionary(c => c.Id, c => (Damaged)c.State);

if (damageDict.TryGetValue(5, out var damage)) {

}

关于c# - 集合的一个字段上的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73501209/

相关文章:

c# - 将 void 传递给泛型类

c# - (如何)C# 知道对象是什么类型?

java - 简单的 Java map 拼图

c# - 返回通用列表

java - 数组声明和集合声明有什么区别

Java 属性类

c# - WinRT : Show upper and lower AppBar independently

C# 私有(private)属性 - 它们是否被使用/有意义?

javascript - 在调用依赖它的方法时设置 javascript 对象属性

c# - 从 RestSharp 客户端将 int 列表传递给 Web API