2017-07-07 18 views
5

Hãy để tôi giải thích ý tôi: Tôi có một cơ sở dữ liệu chứa 4 cột, một trong số đó là Thư, vì vậy mỗi hàng có một ký tự từ 'A' đến 'Z', và chúng không phải là duy nhất, vì vậy có nhiều các hàng có 'A', nhiều hàng có 'B', v.v.Làm cách nào để nhận được các ký tự ngẫu nhiên A-Z?

Điều tôi muốn làm là lấy 26 hàng (az) với TẤT CẢ chữ cái, nhưng ngẫu nhiên các hàng có cùng chữ cái. Vì vậy, tôi muốn 26 hàng từ A đến Z, chỉ có một A, một B ... và các hàng chữ cái này là ngẫu nhiên. Tôi hy vọng các bạn có thể hiểu ý tôi. Cảm ơn trước!

Tôi đã suy nghĩ cái gì đó như:

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

Nhưng tôi không có ý tưởng thực sự.

Trả lời

9

Nếu tôi hiểu câu hỏi một cách chính xác, một cái gì đó như thế này nên làm việc:

Random random = new Random(); 

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

Các Distinct() trong nỗ lực ban đầu của bạn là vô ích lúc tốt nhất, và phản tác dụng lúc tồi tệ nhất.

Ở trên chỉ cần nhóm dữ liệu của bạn theo chữ cái, sau đó chọn một phần tử đơn lẻ ngẫu nhiên từ mỗi nhóm. Nếu bạn có hai mươi sáu chữ cái riêng biệt trong dữ liệu gốc của mình, thì ở trên sẽ chọn một hàng dữ liệu ngẫu nhiên cho từng chữ cái riêng biệt đó. Bạn sẽ nhận được 26 phần tử trong kết quả cuối cùng.

+0

Đây là chính xác nó !! Cám ơn nhiều, ông bạn! –

0

Tôi sẽ đề xuất một biến thể nhỏ về câu trả lời tuyệt vời của Peter.

Hãy thử điều này:

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; 
Các vấn đề liên quan