【问题标题】:Elegant way to map some properties in one List based on Id from another List in C#根据 C# 中另一个列表的 Id 映射一个列表中的某些属性的优雅方法
【发布时间】:2019-12-14 09:48:00
【问题描述】:

我有一个User 列表和Branch 列表。一个Branch 可以有多个User。我需要根据BranchIdBranch 分配User 中的几个属性。这是我的课程。

用户

public class User
{
    public Guid Id { get; set; }
    public bool Active { get; set; }
    public Guid BranchId { get; set; }
    public string BranchName { get; set; }
}

分公司:

public class Branch
{
    public Guid Id { get; set; }
    public bool Active { get; set; }
    public string BranchName { get; set; }
}

这是我尝试过的,

foreach (var user in vm)
{
   var branch = branches.Single(b => b.Id.Equals(user.BranchId));
   user.BranchName = branch.BranchName;   
}

现在这可行,但我觉得这不是一个好的解决方案,因为迭代用户并每次为该用户获取分支并分配它。可能列表中的多个用户可以拥有相同的BranchId,在这种情况下,就像我一次又一次地阅读同一个分支一样。使用 LINQ 的任何更好的解决方案还是可以通过任何方式改进?请帮忙。

【问题讨论】:

  • 一个小的改进是使用.First()而不是.Single(),因为后者总是迭代整个列表...

标签: c# .net performance linq


【解决方案1】:

好吧,您可以创建一个从分支 ID 到品牌名称的字典映射:

var branchIdToBrandName = branches.ToDictionary(b => b.Id, b => b.BrandName);
foreach (var user in users)
{
    user.BrandName = branchIdToBranchName[user.BranchId];
}

这是假设每个分支 ID 恰好有一个分支,并且每个用户的分支 ID 都被覆盖。如果您需要对其他属性执行相同操作,您可能只想将分支 ID 映射到分支,而不是直接映射到品牌名称,例如:

var branchIdToBranch = branches.ToDictionary(branch => branch.Id);
foreach (var user in users)
{
    user.BrandName = branchIdToBranch[user.BranchId].BrandName;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多