假设我有一个名为 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/