从OrderedEnumerable获取原始列表

时间:2010-01-27 20:39:27

标签: c# linq lambda

我有一个对象,它有一个包含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];
}

2 个答案:

答案 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>

的子接口