Получить необработанный список из OrderedEnumerable - PullRequest
0 голосов
/ 27 января 2010

У меня есть объект, у которого есть свойство, которое содержит IEnumerable объектов. Каждый объект в IEnumerable имеет свойство, которое также является IEnumerable. Я пытаюсь захватить больший список внутреннего свойства. К сожалению, лямбда-выражение, которое я использую, возвращает 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);

Редактировать

Итак, после запроса от Джона Скита и Марка Байерса я посмотрел немного глубже и обнаружил, что 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 ]

2 голосов
/ 27 января 2010

Если я правильно понимаю «захватить больший список внутреннего свойства», вы просто хотите

of.CustomerFormList
    .Where(cf => cf.Customer.AssignedOrg == OrgNum)
    .SelectMany(cf => cf.ActiveMachines)

Это вернет вам IEnumerable<Machine>. Как упоминалось в других ответах, IOrderedEnumerable<T> это просто подынтерфейс IEnumerable<T>

2 голосов
/ 27 января 2010

OrderedEnumerable<T> - это и IEnumerable<T> - это одна конкретная реализация. Очевидно, вы должны вернуть некоторую реализацию (или ноль) - это не будет экземпляр интерфейса напрямую.

Код, который вы представили, должен быть в порядке. объявлено для возврата IEnumerable<T>, поэтому не должно иметь никакого значения, если вы не разыгрываете результат. Сказав это, свойство, которое вы показали, не должно возвращать OrderedEnumerable в любом случае ... Enumerable.Where просто возвращает новый итератор. По общему признанию это не изменит порядок, таким образом, вы могли бы иметь перегрузку для Where(this IOrderedEnumerable<T>), но я не верю, что она есть в стандартной библиотеке.

Какая проблема на самом деле вызывает вас, и вы используете дополнительные библиотеки? Если бы вы могли привести короткий, но полный пример, это действительно помогло бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...