2017-09-28 2 views
1

In C# contient une liste d'objets. Par exemple une liste de "voitures" avec l'attribut "couleur". Maintenant, je veux commander au hasard toutes les voitures avec l'attribut "vert" par exemple.Ordre aléatoire d'éléments spécifiques dans la liste d'objets C#

Car c01 = new Car("green","HONDA"); 
Car c02 = new Car("blue","BMW"); 
Car c03 = new Car("green","NISSAN"); 
Car c04 = new Car("blue","VW"); 
Car c05 = new Car("red","MERCEDES"); 
Car c06 = new Car("green","BMW"); 

List<CarAcceleration> Cars = new List<CarAcceleration>(); 
Cars.Add (c01); 
Cars.Add (c02); 
Cars.Add (c03); 
Cars.Add (c04); 
Cars.Add (c05); 
Cars.Add (c06); 

Mon idée serait d'abord écrire toutes les voitures vertes à une deuxième liste, réordonner, puis remplacer en quelque sorte les éléments de la première grande liste. Y a-t-il peut-être une meilleure solution? Merci


Désolé si cela a été trompeur: Je veux toujours garder le reste de la liste dans le bon ordre. Par exemple cet arrangement serait une solution:

Car c06 = new Car("green","BMW"); 
Car c02 = new Car("blue","BMW"); 
Car c01 = new Car("green","HONDA"); 
Car c04 = new Car("blue","VW"); 
Car c05 = new Car("red","MERCEDES"); 
Car c03 = new Car("green","NISSAN"); 
+0

êtes-vous réordonnancement au hasard l'indice des voitures vertes uniquement ou vous d'autres couleurs de voiture écrasées par des voitures vertes faisant des doublons dans la liste originale ?? – BrokenRobot

+0

L'avez-vous vérifié? https://stackoverflow.com/questions/273313/randomize-a-listt –

Répondre

1

Cela fonctionne:

var rnd = new Random(); 
var shuffledGreen = 
    Cars 
     .Where(c => c.Color == "green") 
     .OrderBy(c => rnd.Next()) 
     .ToArray(); 

for (int i = 0, j = 0; i <= Cars.Count() - 1; i++) 
{ 
    if (Cars[i].Color == "green") 
    { 
     Cars[i] = shuffledGreen[j++]; 
    } 
}