如何使用LINQ从对象列表中获取对象匹配选项列表中的选项
本文关键字:选项 列表 何使用 取对象 获取 对象 LINQ | 更新日期: 2023-09-27 18:21:22
我有类Accounts
,其中每个Account
都有
public int Id { get; set; }
public string Currency { get; set; }
以及与问题无关的其他属性。
我还有一个List<string> currencies
,里面有不同货币的字符串名称,这些名称是根据某种逻辑插入的。所以我想做的是给一个List<Accounts> accounts
来获得帐户的Id
,条件是我必须检查所有的accounts
,如果匹配currencies[0]
,如果没有使用这种货币的帐户,然后进行currencies[1]
,以此类推,直到某个帐户具有相同的货币。重要的是保持列表中货币的顺序。我想要一个货币更接近列表开头的账户。
现在我有这个:
string accId = accounts.Where(c => c.Currency.Equals(currencies[0])).FirstOrDefault().Id;
因此,一种选择是将其放入某种循环中,这样我就可以更改currencies索引。然而,我想知道这是否可以完全用LINQ制作?
string accId =
(from currency in currencies
from account in accounts
where account.Currency.Equals(currency)
select account.Id).FirstOrDefault();
林克用这种方式更有趣!)
编辑:如果你不喜欢语法,这里是替代版本:
var accId = currencies
.SelectMany(currency => accounts
.Where(account => account.Currency.Equals(currency))).FirstOrDefault().Id;
实时演示
这不会给你一个列表,但它比获得整个列表更高效:
var id = currencies.Select(currency => accounts.FirstOrDefault(x => x.Currency == currency))
.Where(account => account != null)
.FirstOrDefault().Id;
如果你想要整个列表,可以这样做:
var accs = currencies.Select(currency => accounts.FirstOrDefault(x => x.Currency == currency))
.Where(account => account != null)
.ToList();
如果你只想要IEnumerable,那么就这样做:
var accs = currencies.Select(currency => accounts.FirstOrDefault(x => x.Currency == currency))
.Where(account => account != null);
您可以使用索引作为排序顺序(注意,与您的示例一样,如果没有匹配,这将抛出)。。。
var accountId = currencies.Select((c, i) => new { Currency = c, SortOrder = i })
.Join(accounts,
c => c.Currency,
a => a.Currency,
(c, a) => new { Account = a, SortOrder = c.SortOrder })
.OrderBy(x => x.SortOrder)
.First()
.Account.Id;
实时演示