2017-03-20 41 views
0

Existe-t-il un moyen facile d'influencer la séquence de traitement d'une ObservableCollection en C#?Changement de la séquence de traitement de ObservableCollection <T> (C#)

Disons que j'ai la classe suivante:

public class GeneratorObject : IComparable 
{ 
     int processingSequence {get; set;} 
     string property1 {get; set;} 
     Boolean property2 {get; set;} 

     public GeneratorObject(int processingSequence) 
     { 
      this.processingSequence = processingSequence; 
     } 

     public int CompareTo(object obj) 
     { 
      // Implementation 
     }    
} 

La séquence de traitement pourrait être tout nombre naturel.

Je veux itérer certains de certains d'entre eux

ObservableCollection<GeneratorObject> toIterate = new ObservableCollection<GeneratorObject>(); 

toIterate.Add(new GeneratorObject(99)); 
toIterate.Add(new GeneratorObject(1)); 
toIterate.Add(new GeneratorObject(10)); 
toIterate.Add(new GeneratorObject(6)); 

foreach (GeneratorObject field in toIterate) 
{ 
    // Manipulating the properties of field 
} 

Je ne veux pas vraiment trier la collection, espeacially dans la vue. Je veux juste changer l'ordre pour l'itération. Tout d'abord, l'élément avec le numéro de séquence le plus bas, ..., En outre, il est important de dire que manipuler les éléments en itérant et ne pouvait pas utiliser une copie de la collection.

J'ai déjà implémenté IComparable et pensé que je pourrais dire facilement par exemple. Collection.Sort() sans détruire la liaison avec l'interface utilisateur.

Merci pour toute aide.

+0

Qu'avez-vous essayé? La réponse douloureusement évidente est de trier une copie de la collection (comme - finalement - recommandé par la réponse affichée ci-dessous). Une raison pour laquelle vous ne faites pas ça? Svp soyez plus précis, et fournissez un bon [mcve] qui montre clairement ce que vous avez essayé, expliquez en quoi vous avez spécifiquement des problèmes. –

+0

Merci pour le conseil. Je vais essayer d'être plus précis le temps enxtérieur. Le problème de ne pas faire face est de manipuler les objets pendant l'itération. – theawak3r

+0

S'il vous plaît modifier votre question pour fournir des clarifications. Notez que même avec votre clarification, la question est encore large. Cela dit, bien que vous puissiez maintenir un tableau trié d'index dans la collection sous-jacente, si vous changez la collection pendant que vous itérez, vous devriez probablement faire un balayage linéaire sur la collection chaque fois que vous voulez effectuer votre opération sur la séquence la plus basse #, pour trouver le # le plus bas. –

Répondre

0

Merci pour l'indice avec la copie. Je ne sais pas si c'est une bonne réponse (surtout en ce qui concerne performce), mais j'ai résolu le problème de la façon suivante.

var copy = toIterate.ToList(); 
copy.Sort(); 

// iterate through the sorted List 
foreach (GeneratorObject field in copy) 
{ 
    // get the original object regarding to this sorted item 
    GeneratorObject originalObjectForAction = getGeneratorObject(toIterate, field); 
    // do stuff with the original item 
} 

public GeneratorObject getGeneratorObject(ObservableCollection<GeneratorObject> list, GeneratorObject objekt) 
{ 
    foreach (DwhRoboterGeneratorObjekt field in list) 
    { 
     if (field == objekt) return field; 
    } 
    throw new Exception("Not found"); 
} 
0

Vous pouvez créer un copy de la liste, trier puis itérer la liste copy:

 //ObservableCollection<GeneratorObject> toIterate; 
     // I am assuming that 'toIterate' is not null and bound to the UI 
     toIterate.Add(new GeneratorObject(99)); 
     toIterate.Add(new GeneratorObject(1)); 
     toIterate.Add(new GeneratorObject(10)); 
     toIterate.Add(new GeneratorObject(6)); 

     var copy = toIterate.ToList(); 
     copy.Sort(); 

     foreach (GeneratorObject field in copy) 
     { 

     } 

L'action de tri ici est exécuté sur une autre liste afin de ne pas changer l'ordre dans l'interface utilisateur .

+0

Merci pour la réponse. Le problème est, que im manipuler les objets en itérant. J'ai aussi eu cette idée de copier mais ensuite je perds la référence aux objets réels. – theawak3r

0

Si la liste change pendant que vous itérez, alors au lieu d'itérer, vous pouvez faire une boucle jusqu'à ce que la liste soit vide, et trouver min chaque itération.

while (toIterate.Any()) 
{ 
    GeneratorObject generatorObject = toIterate.Min(); 
    // do something with it 
}