2010-01-27 7 views
0

J'ai un objet qui a une propriété qui contient un IEnumerable d'objets. Chaque objet du IEnumerable a une propriété qui est également IEnumerable. J'essaye de capturer une plus grande liste de la propriété intérieure. Malheureusement, l'expression lambda que j'utilise renvoie un OrderedEnumerable. Je voudrais juste récupérer un simple IEnumerable.Récupère la liste brute de OrderedEnumerable

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

Utilisation de CustomerFormList

OrgForm of = new OrgForm(); 
IEnumerable<Machine> machines = of.CustomerFormList 
            .Select(cf => cf.ActiveMachines); 

Modifier

Donc, après avoir incité de Jon Skeet et Mark Byers, je regardais un peu plus profond et a constaté que ActiveMachines avaient été modifiées pour effectuer une OrderBy alors maintenant le retour d'un OrderedEnumerable a du sens (mon mauvais pour ne pas lire le jeu de code modifier les commentaires).

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

Ceci est une grande exception machines ne me permet pas d'écrire quelque chose comme ceci comme il l'entend chaque élément machines comme dénombrable en fonction de la catégorie.

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

Que voulez-vous dire par "ne fonctionne pas". Est-ce une erreur de compilation ou une exception lors de l'exécution? Quel message d'erreur obtenez-vous? –

+0

Je ne comprends toujours pas votre question, désolé. Peut-être pourriez-vous essayer de simplifier votre problème pour que le code complet, y compris toutes les classes et fonctions nécessaires, se place sur un écran, et que nous puissions copier et coller le code dans Visual Studio et voir exactement la même erreur. Il manque trop de code pour que je puisse deviner quel pourrait être votre problème. –

+0

Je ne comprends pas l'édition. ActiveMachines renvoie explicitement un IEnumerable , pas un IEnumerable >. Que voulez-vous dire par "ne me permet pas"?Comme Mark l'a dit à l'origine, soyez explicite au sujet de l'erreur ou du bogue que vous voyez. –

Répondre

2

OrderedEnumerable<T>est un IEnumerable<T> - c'est une mise en œuvre particulière. Évidemment vous devez retourner une implémentation (ou null) - ce ne sera pas une instance de l'interface directement.

Le code que vous avez présenté devrait être correct comme il est. Il est déclaré pour renvoyer IEnumerable<T>, cela ne devrait donc pas faire de différence à moins que vous ne lanciez le résultat. Cela dit, la propriété que vous avez montrée ne devrait pas renvoyer un OrderedEnumerable de toute façon ... Enumerable.Where renvoie juste un nouvel itérateur. Certes, il ne changera pas l'ordre de sorte que pourrait avoir une surcharge pour Where(this IOrderedEnumerable<T>) mais je ne crois pas qu'il y en ait un dans la bibliothèque standard.

De quel problème est-ce que cela vous cause réellement, et utilisez-vous des bibliothèques supplémentaires? Si vous pouviez trouver un exemple court mais complet, cela aiderait vraiment.

+0

J'ai ajouté mon intention ultime à la question. Merci pour la clarification sur 'OrderedEnumerable '. Apprendre encore lambda/linq et être las de sauter aux conclusions. – ahsteele

2

Si je comprends « capturer une plus grande liste de la propriété intérieure » correctement, vous voulez juste

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

Cela vous renvoie un IEnumerable<Machine>. Comme mentionné par les autres réponses, IOrderedEnumerable<T> est juste une sous-interface de IEnumerable<T>

+0

+1 Cela ressemble à une supposition intelligente de ce qu'il veut, basé sur les noms des champs. Je ne vois pas de "commande par" dans son code de toute façon, donc je suis encore très confus au sujet de cette partie de sa question ... –

Questions connexes