如何使用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制作?

如何使用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;

实时演示