我有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;
所以一个选择是把它放在某种循环中,这样我就可以改变currnecies索引。不过我想知道这是否可以纯粹用LINQ制作?
答案 0 :(得分:2)
string accId =
(from currency in currencies
from account in accounts
where account.Currency.Equals(currency)
select account.Id).FirstOrDefault();
Linq使用这种方式更有趣! ;)
编辑:如果你不喜欢这种语法,可以选择以下版本:
var accId = currencies
.SelectMany(currency => accounts
.Where(account => account.Currency.Equals(currency))).FirstOrDefault().Id;
答案 1 :(得分:1)
这并没有给你一个列表,但它比获取整个列表更有效:
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);
答案 2 :(得分:0)
您可以使用索引作为排序顺序(请注意,就像您的示例一样,如果没有匹配则会抛出...)
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;