如何使用LINQ从选项列表中的匹配选项列表中获取对象

时间:2014-09-10 06:04:24

标签: c# linq

我有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制作?

3 个答案:

答案 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;

Live Demo

答案 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;

Live Demo