2016-03-28 4 views
0

Ich schreibe an Sie mit kleinen Problem. Ich schreibe kleine Anwendung in C# .NET MVC5, und ich habe eine Frage, wie kann ich ein paar zufällige Elemente von List bekommen?Wie bekomme ich eine zufällige Anzahl von Element aus der Liste

Mein Code: richtig

public ActionResult ProductsList() 
{ 
    List<Product> products = productRepo.GetProduct().ToList(); 
    return PartialView(products); 
} 

Diese Methode vollständige Liste zurückkehren, wie kann ich es tun?

+0

Was ist mit wenigen, 2 oder 3 oder einer bestimmten Zahl gemeint? –

+0

Bitte, erarbeiten * einige zufällige Artikel *. Zum Beispiel, erlauben Sie * wiederholen *? : 'Liste [3], Liste [7], Liste [3]'? Sollen die Gegenstände * bestellt * werden: 'List [3], List [8]' oder 'List [8], List [3]' geht das auch? –

+0

6 Elemente können gut sein, ohne zu wiederholen – Giacomo

Antwort

1

Generieren Sie eine zufällige Nein und holen Sie die 6 Elemente der Liste basierend auf der Zufallszahl generiert.

public ActionResult ProductsList() 
    { 
     Random rnd = new Random(); 
     List<Product> products = productRepo.GetProduct().ToList(); 
     Random r = new Random(); 
     int randomNo = r.Next(1, products.Count); 
     int itemsRequired = 6; 
     if (products.Count <= itemsRequired) 
      return PartialView(products)); 
     else if (products.Count - randomNo >= itemsRequired) 
      products = products.Skip(randomNo).Take(itemsRequired).ToList(); 
     else 
      products = products.Skip(products.Count - randomNo).Take(itemsRequired).ToList(); 
     return PartialView(products)); 
+0

Wie kann ich minimale und maximale Anzahl von zufälligen Elementen machen? Jetzt gebe ich mir eine zufällige Anzahl von Elementen. Ich brauche 6 Elemente standardmäßig, immer. – Giacomo

+1

@ Giacomo, Ich habe meine Antwort für die Generierung von 6 Elementen immer aktualisiert. –

+0

Was ist, wenn die erste Liste 'Produkte' * zu wenige * Werte hat? Z.B. '3' nur, wenn' itemsRequired = 6'? In Ihrem aktuellen Code wird eine * Ausnahme * ausgelöst, wenn der beste Weg, IMHO, ist, die gesamte Liste zurückzugeben. –

1

eine Instanz von Random-Klasse irgendwo erstellen. Beachten Sie, dass es ziemlich wichtig ist, nicht jedes Mal eine neue Instanz zu erstellen, wenn Sie eine Zufallszahl benötigen. Sie sollten die alte Instanz wiederverwenden, um eine Gleichmäßigkeit der generierten Zahlen zu erreichen.

static Random rnd = new Random(); 
List<Product> products = productRepo.GetProduct().ToList(); 
int r = rnd.Next(products.Count); 
products = products.Take(r).ToList(); 
+2

Ich bin mir ziemlich sicher, dass das immer vom Anfang der Liste dauern wird. – Derek

+0

Was passiert, wenn 'rnd.Next (list.Count)' '* null * zurückgibt? Wahrscheinlich ist eine * Emply-Liste * keine gewünschte Ausgabe. –

0

Nutzen Sie die Zufallsklasse und die Verwendung von NEXT-Funktion machen, die die nicht negative Zahl unter den angegebenen Grenzwert zurück ...

List<Product> products = productRepo.GetProduct().ToList(); 

var randomProduct=new Random(); 

var index=randomProduct.Next(products.Count); 

return PartialView(products[index]); 

Hoffnung könnte Ihnen helfen .. Glücklich Codierung

3

ich schlage vor, die Auswahl zufällige Indizes und dann zurückkehr entsprechende Artikel:

// Simplest, not thread-safe 
private static Random s_Random = new Random(); 

private static List<Product> PartialView(List<Product> products, int count = 6) { 
    // Too few items: return entire list 
    if (count >= products.Count) 
    return products.ToList(); // Let's return a copy, not list itself 

    HashSet<int> taken = new HashSet<int>(); 

    while (taken.Count < count) 
    taken.Add(s_Random.Next(count)); 

    List<Product> result = new List<Product>(count); 

    // OrderBy - in case you want the initial order preserved 
    foreach (var index in taken.OrderBy(item => item)) 
    result.Add(products[index]); 

    return result; 
} 
Verwandte Themen