c# - 如果我的条件匹配,如何从另一个列表中选择项目?

标签 c# linq

我对 C# 列表有疑问。

我有两种不同类型的列表(account 和 accountDescriptionHistory)。 accountID 和 accountdescription 两列均出现在列表中。

var account = new List<Account>();
var accountDescriptionHistory = new List<AccountDescriptionHistory>();

现在,我想根据以下条件准备一个结果列表。

  1. 如果 accountID 匹配,请从 accountDescriptionHistory 列表中选择一个帐户描述。
  2. 结果列表应为List()类型;

类定义

public class Account
{

    /// <summary>
    /// The account number
    /// </summary>
    public virtual string AccountNumber { get; set; }

    /// <summary>
    /// The account's description
    /// </summary>
    public virtual string Description { get; set; }
}

帐户描述类:

    public class AccountDescriptionHistory : EntityModel<AccountDescriptionHistory>
    {
        #region Public Properties

        /// <summary>
        /// The account description of an account that is valid for a specific date range
        /// </summary>
        public virtual string AccountDescription { get; set; }

        /// <summary>
        /// The account this AccountDescriptionHistory is associated with.
        /// </summary>
        public virtual Account Account { get; set; }
}

最佳答案

您的问题不清楚确切的输出。话虽如此。

给定

List<Account> accounts = new List<Account>
{ 
    new Account {AccountNumber = "1", Description = "Account 1"}, 
    new Account {AccountNumber = "2", Description = "Account 2"},
    new Account {AccountNumber = "4", Description = "Account 4"}, 
};

List<AccountDescriptionHistory> accountHistories = new List<AccountDescriptionHistory>
{ 
    new AccountDescriptionHistory {AccountDescription = "History Account 1", Account = accounts[0] }, 
    new AccountDescriptionHistory {AccountDescription = "History Account 2", Account = accounts[1] }, 
    new AccountDescriptionHistory {AccountDescription = "History Account 3", Account = new Account {AccountNumber = "3", Description = "Account 3"} }, 
};

我们想要使用 AccountNumber 查找 accounts 中存在的所有 accountHistories,我们可以编写一个 Where 子句来查找所有这些:

List<AccountDescriptionHistory> result = accountHistories
    .Where(x => accounts.Any(y => y.AccountNumber == x.Account.AccountNumber))
    .ToList();

如果您只想从结果中检索 AccountDescription,您可以编写:

List<string> result = accountHistories
    .Where(x => accounts.Any(y => y.AccountNumber == x.Account.AccountNumber))
    .Select(x => x.AccountDescription)
    .ToList();

如果您希望将结果转换为具有 AccountDescriptionHistory 描述的 Account,您可以执行以下操作:

List<Account> result = accountHistories
    .Where(x => accounts.Any(y => y.AccountNumber == x.Account.AccountNumber))
    .Select(x => new Account {AccountNumber = x.Account.AccountNumber, Description = x.AccountDescription})
    .ToList();

编辑

您可以创建这样的函数:

static Account WithDescriptionHistory(Account account, IEnumerable<AccountDescriptionHistory> accountHistories)
{
    AccountDescriptionHistory accountHistory = accountHistories.FirstOrDefault(x => x.Account.AccountNumber == account.AccountNumber);
    account.Description = accountHistory?.AccountDescription ?? account.Description;
    return account;
}

然后将原始的 account 变量转换为:

accounts = accounts
    .Select(x => WithDescriptionHistory(x, accountHistories))
    .ToList();

输出

History Account 1
History Account 2
Account 4

关于c# - 如果我的条件匹配,如何从另一个列表中选择项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63444893/

相关文章:

c# - 具有多个/未知条件的动态 linq 查询

c# - 将 Prolog 与 C# 集成

c# - UnderlyingSystemType 何时与当前 Type 实例不同

c# - 如何添加带条件的权限条目?

c# - LINQ:不是任何 vs 全部都不是

c# - 确定集合是否属于 IEnumerable<T> 类型

c# - 聚合值直到达到限制

c# - EntityFramework .Take() 随着时间的推移性能下降

c# - 只允许一个线程通过/不让线程不必要地等待

c# - 使用 LINQ To NHibernate 按具有全部最大值的可变上限值分组