2017-07-07 88 views
5

Pozwól mi wyjaśnić, co mam na myśli: Mam bazę danych, która zawiera 4 kolumny, z których jedna jest literą, więc każdy wiersz ma znak od "A" do "Z", a te nie są unikalne, więc istnieje wiele wiersze z literą "A", wiele wierszy z literą "B" itd.Jak uzyskać tablicę losowych liter A-Z?

Co chcę zrobić, to uzyskać 26 (az) wierszy z WSZYSTKIMI literami, ale wybrać losowo wiersze, które mają te same litery. Tak więc potrzebuję 26 wierszy od A do Z, tylko jeden A, jeden B ..., a wiersze tych liter są losowe. Mam nadzieję, że zrozumiecie o co mi chodzi. Z góry dziękuję!

myślałam coś takiego:

var randomQuestions = questions.Distinct().GroupBy(q => q.Letter).Take(26).ToArray(); 

Ale nie mam pojęcia, naprawdę.

Odpowiedz

9

Jeśli dobrze rozumiem pytanie, coś jak to powinno działać:

Random random = new Random(); 

var randomQuestions = questions 
    .GroupBy(q => q.Letter) 
    .SelectMany(g => g.Skip(random.Next(g.Count())).Take(1)); 

The Distinct() w oryginalnej wysiłek jest bezużyteczny w najlepszym wypadku, i nieproduktywne na najgorsze.

Powyższe po prostu grupuje dane według litery, a następnie wybiera losowy pojedynczy element z każdej grupy. Jeśli masz dwadzieścia sześć różnych liter w oryginalnych danych, powyższe wybiorą jeden losowy wiersz danych dla każdej z tych odrębnych liter. W końcowym wyniku otrzymasz dwadzieścia sześć elementów.

+0

To było dokładnie to !! Dzięki wielkie! –

0

Zamierzam zasugerować niewielką odmianę doskonałej odpowiedzi Piotra.

Spróbuj tego:

Random random = new Random(); 

var randomQuestions = 
    from q in questions 
    orderby random.Next() 
    group q by q.Letter into gqs 
    from gq in gqs.Take(1) 
    select gq;