gpt4 book ai didi

c# - LINQ:选择一个集合?

转载 作者:行者123 更新时间:2023-11-30 13:42:02 25 4
gpt4 key购买 nike

我正在尝试使用 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?)

正确的语法是什么?

最佳答案

您提供的代码无法编译,因为您试图分配一个序列的字符串序列(每个顶级序列来自特定 expense) 到需要字符串序列的引用。

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

// 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 });

关于c# - LINQ:选择一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3900627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com