如何解决如果我的条件匹配,如何从另一个列表中选择项目?
我有一个有关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"} },};
我们想要使用accountHistories
查找accounts
中存在的所有AccountNumber
,我们可以编写一个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();
如果您希望将结果转换为Account
中的描述,而将其转换为AccountDescriptionHistory
,则可以执行以下操作:
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
,
因此,根据您的评论,您需要此代码
foreach (var a in account)
{
if (!accountDescriptionHistory.Any(x => x.accountID == a.accountID)) continue;
a.Description = accountDescriptionHistory.FirstOrDefault(x => x.accountID == a.accountID).AccountDescription;
}
,
假设您具有以下两个类别:
public class A
{
public int Id { get; set; }
}
public class B
{
public int Id { get; set; }
public string desc { get; set; }
}
您可以使用LINQ Join语句创建与第一个列表中的ID匹配的描述的列表
List<A> one = new List<A>
{
new A {Id = 1},new A {Id = 2}
};
List<B> two = new List<B>
{
new B {Id = 1,desc = "test"},new B {Id = 2,desc = "test two"}
};
var result = one.Join(
two,x => x.Id,y => y.Id,(x,y) => new {Id = x.Id,Desc = y.desc}
).ToList();
,
亲爱的阿米特,我希望这会有所帮助
public partial class TesterForm : Form
{
List<Account> account = new List<Account>();
List<AccountDescriptionHistory> accountDescriptionHistory = new List<AccountDescriptionHistory>();
List<AccountDescriptionHistory> resultlist = new List<AccountDescriptionHistory>();
public TesterForm()
{
InitializeComponent();
}
public class Account
{
public int accountID { get; set; }
public string accountdescription { get; set; }
}
public class AccountDescriptionHistory
{
public int accountID { get; set; }
public string accountdescription { get; set; }
}
private void button1_Click(object sender,EventArgs e)
{
Account accountmodel = new Account();
accountmodel.accountID = 1;
accountmodel.accountdescription = "desc1";
account.Add(accountmodel);
Account accountmodel1 = new Account();
accountmodel1.accountID = 2;
accountmodel1.accountdescription = "desc2";
account.Add(accountmodel1);
Account accountmodel3 = new Account();
accountmodel3.accountID = 3;
accountmodel3.accountdescription = "desc3";
account.Add(accountmodel3);
AccountDescriptionHistory accountdescmodel = new AccountDescriptionHistory();
accountdescmodel.accountID = 3;
accountdescmodel.accountdescription = "desc4";
accountDescriptionHistory.Add(accountdescmodel);
AccountDescriptionHistory accountdescmodel2 = new AccountDescriptionHistory();
accountdescmodel2.accountID = 4;
accountdescmodel2.accountdescription = "desc5";
accountDescriptionHistory.Add(accountdescmodel2);
AccountDescriptionHistory accountdescmodel3 = new AccountDescriptionHistory();
accountdescmodel3.accountID = 5;
accountdescmodel3.accountdescription = "desc6";
accountDescriptionHistory.Add(accountdescmodel3);
}
private void button2_Click(object sender,EventArgs e)
{
foreach (Account item in account)
{
foreach (AccountDescriptionHistory item2 in accountDescriptionHistory)
{
if (item.accountID==item2.accountID)
{
AccountDescriptionHistory history = new AccountDescriptionHistory();
history.accountID = item.accountID;
history.accountdescription = item2.accountdescription;
resultlist.Add(history);
}
}
}
comboBox1.DataSource = resultlist;
comboBox1.DisplayMember = "accountdescription";
}
}
我正在使用Visual Studio 2019窗体,您将需要两个按钮和一个组合按钮以查看我测试过的结果。 添加到您的窗体combobox1,button1和button2。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。