2016-04-16 16 views
0

Ich habe ein kleines Problem hier. Ich habe eine Liste von Fragen KlausimuList und ich muss eine andere Liste bilden Atsitiktinis Hexe wäre eine zufällige Länge und würde zufällige Fragen aus KlausimuList genommen haben. Meine Methode funktioniert, aber das Problem ist - Fragen werden dupliziert. Könnten Sie mir bitte einen Code schreiben, wo sie nicht sind? Ich habe die Idee, ein eigenes int-Array von Fragen zu erstellen, die ich bereits hinzugefügt habe, und dann jedes Mal zu überprüfen, ob sich diese Frage bereits in dieser Liste befindet. Wenn das der Fall ist - generiere eine neue Nummer, aber ich weiß einfach nicht, wie ich den Code für dieses Ding schreiben soll: D. Danke in Beratung. Code ist in C#.Zufällige Objekte zu einer Liste ohne Wiederholung

static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis) 
    { 
     Random kiek = new Random(); 
     int kiekis = kiek.Next(1, KlausimuList.Count); 
     for (int i = 0; i < kiekis; i++) 
      Atsitiktinis.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)]); 
    } 
+2

Werfen Sie einen Blick auf 'HashSet', wird es nicht zulassen, dass Duplikate hinzugefügt werden: https://msdn.microsoft.com/library/bb353005(v=vs.110).aspx. Oder erstellen Sie eine Kopie Ihrer ursprünglichen Liste und entfernen Sie die verwendeten Elemente daraus. –

Antwort

1

Sie könnten HashSet verwenden, um Duplikate zu vermeiden. Add Methode auf HashSet gibt false zurück, wenn versuchen, doppeltes Element hinzuzufügen.

static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis) 
{ 
    Random kiek = new Random(); 
    int kiekis = kiek.Next(1, KlausimuList.Count); 

    HashSet<Klausimas> hashset= new HashSet<Klausimas>(); 

    for (int i = 0; i < kiekis;) 
    { 
     i+= hashset.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)])? 1:0; // returns true when successfully added. 
    } 

    Atsitiktinis = hashset.ToList();    
} 
+0

Arbeitete perfekt. Vielen Dank! :) – Deividas

+0

Es wäre wahrscheinlich sinnvoller, eine Liste zurückzugeben und nicht den Ref-Parameter zu haben. Ich weiß, dass das OP so war, aber es ist immer noch ein bisschen komisch – pinkfloydx33

0

Dies sollte funktionieren. Es erstellt eine Kopie der ursprünglichen Liste und entfernt die bereits getroffenen Gegenstände daraus:

static List<Klausimas> FormuotiAtsisiktini(List<Klausimas> KlausimuList) 
{ 
    Random kiek = new Random(); 

    List<Klausimas> source = new List<Klausimas>(KlausimuList); 
    List<Klausimas> result = new List<Klausimas>(); 
    int kiekis = kiek.Next(1, KlausimuList.Count); 
    for (int i = 0; i < kiekis; i++) 
    { 
    var match = source[kiek.Next(0, source.Count - 1)]; 
    result.Add(match); 
    source.Remove(match); 
    } 

    return result; 
} 
0

Was Sie beschreiben, ohne Ersatz Sampling genannt wird, und eine Lösung für das in this SO post zur Verfügung gestellt. Um sicherzustellen, dass Sie Ihrer Sammlung tatsächlich Duplikate hinzufügen, sollten Sie darüber hinaus eine HashSet anstelle einer List verwenden.

Verwandte Themen