2010-10-10 181 views
3

我试图使用LINQ:LINQ:选择一个集合?

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

usernameWhoPaid是字符串,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?) 

这是什么正确的语法?

回答

8

您提供的不编译,因为你想分配序列串序列(每个顶级序列从特定代价的),以期望一个参考代码字符串序列。

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

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

(你可以使用一个SelectMany条款做投影和压扁在一起。)

,或者在查询语法:

var debtors = (from expense in CurrentExpenses 
       where expense.WhoPaid == username 
       from debtor in expense.WhoOwes 
       select debtor).Distinct(); 

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

// implicitly IEnumerable<Expense> 
var expensesPaidByUser = CurrentExpenses.Where(expense => expense.WhoPaid == username); 

与各项支出相关的债务人都是已经封装在Expense对象中,所以你可能不需要比这更复杂的查询;它已经实际上是按费用分组的一系列债务人的序列。

如果你想单独的类型来保存费用及其相关债务人,你可以用匿名类型做到这一点,虽然我不明白为什么它在你的情况下,有必要:

// implictly IEnumerable<anonymousType> 
var debtorsByExpense = CurrentExpenses.Where(expense => expense.WhoPaid == username) 
             .Select(expense => new { Expense = expense, Debtors = expense.WhoOwes }); 
+0

+1非常好的答案 – Khh 2010-10-10 15:21:32

2

使用:

var debtors = ... 

,而不是

IEnumerable<String> debtors = ... 

LINQ表达式的返回类型是经常difficul以确定程序员。 var关键字告诉编译器自动推断该类型,因此您不需要。将鼠标光标悬停在您的IDE中的var上,以查看编译器推断的内容。

+0

为什么这是首选? (我是LINQ的新手,谢谢。) – 2010-10-10 14:16:01

+0

编辑我的答案以显示它... – CesarGon 2010-10-10 14:17:32

+0

+1。对于LINQ,编译器在这种情况下使用了两个功能。它们被命名为“隐式变量类型”(http://msdn.microsoft.com/zh-cn/com/en-us/library/bb384061.aspx)和“匿名类型”(http://msdn.microsoft.com/zh-cn/library/bb397696.aspx) – 2010-10-10 14:32:12