LINQ:选择一个系列?

Nic*_*ner 3 c# linq

我正在尝试使用LINQ:

IEnumerable<String> debtors = (from expense in CurrentExpenses
                               where expense.WhoPaid == username
                               select expense.WhoOwes.AsEnumerable()).Distinct();
Run Code Online (Sandbox Code Playgroud)

(username并且WhoPaid是字符串,WhoOwesICollection<String>)

我想要做的就是一个IEnumerable的,每个expense地方username支付,所有谁欠了它的人.我不太确定该怎么做.这是编译器错误:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<string>>' to 'System.Collections.Generic.IEnumerable<string>'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

这个的正确语法是什么?

Ani*_*Ani 8

您提供的代码无法编译,因为您尝试将一系列字符串序列(每个顶级序列来自特定费用)分配给需要字符串序列的引用.

按照查询的返回类型,我假设您只需要一个包含用户所有债务人的序列?如果是这样,您需要展平结果序列.

// implicitly IEnumerable<string>
var debtors = CurrentExpenses.Where(expense => expense.WhoPaid == username)
                             .Select(expense => expense.WhoOwes)
                             .SelectMany(debtors => debtors) // flatten sequence
                             .Distinct();
Run Code Online (Sandbox Code Playgroud)

(您可以使用单个SelectMany子句一起进行投影和展平.)

或者,在查询语法中:

var debtors = (from expense in CurrentExpenses
               where expense.WhoPaid == username
               from debtor in expense.WhoOwes
               select debtor).Distinct();
Run Code Online (Sandbox Code Playgroud)

如果您需要查找用户及其相关债务人支付的所有费用,您可以在第一个过滤器处停止:

// implicitly IEnumerable<Expense>
var expensesPaidByUser = CurrentExpenses.Where(expense => expense.WhoPaid == username);
Run Code Online (Sandbox Code Playgroud)

与每个费用相关联的债务人已经封装在Expense对象中,因此您可能不需要比这更复杂的查询; 它已经实际上是按费用分组的一系列债务人序列.

如果你确实需要一个单独的类型来支付费用及其相关的债务人,你可以用匿名类型来做,虽然我不明白为什么在你的情况下它是必要的:

// implictly IEnumerable<anonymousType>
var debtorsByExpense = CurrentExpenses.Where(expense => expense.WhoPaid == username)
                                      .Select(expense => new { Expense = expense, Debtors = expense.WhoOwes });
Run Code Online (Sandbox Code Playgroud)