我有一个对象,它有一个包含IEnumerable对象的属性。 IEnumerable
中的每个对象都有一个属性IEnumerable
。我试图捕获更大的内部属性列表。不幸的是,我使用的lambda表达式返回OrderedEnumerable
。我想找一个简单的IEnumerable
。
public class OrgForm
{
public string OrgNum { get; set; }
public IEnumerable<CustomerForm> CustomerFormList
{
get
{
var list = from cf in OrgCustomerList
where cf.Customer.AssignedOrg == OrgNum
select cf;
return list;
}
}
}
使用CustomerFormList
OrgForm of = new OrgForm();
IEnumerable<Machine> machines = of.CustomerFormList
.Select(cf => cf.ActiveMachines);
修改
所以在Jon Skeet和Mark Byers的提示后,我看起来更深一些,发现ActiveMachines已被修改为执行OrderBy
所以现在返回OrderedEnumerable
是有意义的(我不好意思阅读代码集改变评论)。
public class CustomerForm
{
public IEnumerable<Machine> ActiveMachines
{
get
{
var active = Customer.MachineList.ToList()
.Where(m => "a".Equals(m.MachineStatus)
&& !m.ToReapp);
return active.OrderBy(m => m.MachineCategory);
}
}
}
这很好,除了machines
不允许我写这样的内容,因为它将machines
中的每个项目视为基于类别的可枚举。
foreach (KeyValuePair<int, string[]> kvp in trueUpPt)
{
Machine machine = cf.ActiveMachines
.First(m => m.MachineSk == kvp.Key);
machine.MachineLicenseBillback.ProjectNum = kvp.Value[0];
machine.MachineLicenseBillback.TaskNum = kvp.Value[1];
}
答案 0 :(得分:2)
OrderedEnumerable<T>
是IEnumerable<T>
- 这是一个特定的实现。显然你必须返回一些实现(或null) - 它不会直接作为接口的实例。
您提供的代码应该没问题。它是声明返回IEnumerable<T>
所以除非你施放结果,否则它不应该有任何区别。话虽如此,你所展示的属性无论如何都不应该返回OrderedEnumerable
...... Enumerable.Where只返回一个新的迭代器。不可否认,它不会改变顺序,因此可能重载Where(this IOrderedEnumerable<T>)
,但我不相信标准库中有一个。
这实际上会给您带来什么问题,您是否正在使用一些额外的库?如果你能想出一个简短但完整的例子,它真的会有所帮助。
答案 1 :(得分:2)
如果我理解“正确捕获更大的内部属性列表”,你只需要
of.CustomerFormList
.Where(cf => cf.Customer.AssignedOrg == OrgNum)
.SelectMany(cf => cf.ActiveMachines)
这会给你一个IEnumerable<Machine>
。正如其他答案所述,IOrderedEnumerable<T>
只是IEnumerable<T>