我对 C# 列表有疑问。
我有两种不同类型的列表(account 和 accountDescriptionHistory)。 accountID 和 accountdescription 两列均出现在列表中。
var account = new List<Account>();
var accountDescriptionHistory = new List<AccountDescriptionHistory>();
现在,我想根据以下条件准备一个结果列表。
- 如果 accountID 匹配,请从 accountDescriptionHistory 列表中选择一个帐户描述。
- 结果列表应为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/