我正在尝试使用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是字符串,WhoOwes是ICollection<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)
这个的正确语法是什么?
您提供的代码无法编译,因为您尝试将一系列字符串序列(每个顶级序列来自特定费用)分配给需要字符串序列的引用.
按照查询的返回类型,我假设您只需要一个包含用户所有债务人的序列?如果是这样,您需要展平结果序列.
// 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)