2012-05-18 76 views
8

Tôi đang sử dụng đoạn mã sau đây để tải tệp văn bản của mình vào số băm băm.Lấy phần tử ngẫu nhiên từ hashset?

HashSet<string> hashs = new HashSet<string>(File.ReadLines("textFile.txt")); 

Tôi tự hỏi liệu có cách nào dễ dàng để nhận một dòng ngẫu nhiên từ nó không?

Cho phép asume textFile.txt chứa 10 dòng, tôi muốn ngẫu nhiên và lấy một trong các dòng hiện có đó.

+1

Bạn đã thử gì? Bạn đã thử sử dụng lớp System.Random để tạo ra một số ngẫu nhiên giữa 0 một <# of lines> và sau đó tham chiếu mục đó theo chỉ mục? Đó là tất cả các nhiệm vụ đã được tài liệu tại thư viện MSDN. http://mattgemmell.com/2008/12/08/what-have-you-tried/ – David

Trả lời

10
Random randomizer = new Random(); 
string[] asArray = hashs.ToArray() 
string randomLine = asArray[randomizer.Next(asArray.length)]; 
+0

hoạt động hoàn hảo! cảm ơn người đàn ông – user1213488

+3

Khá hiệu quả khôn ngoan khôn ngoan. Không phải là tôi biết một cách tốt hơn, nhưng chỉ cần nói. – batman

2

Bạn có thể tạo một số ngẫu nhiên giữa 0 và kích thước của tập hợp, sau đó lặp qua thiết lập cho đến khi bạn đến mục có chỉ mục giống với số được tạo. Sau đó chọn mục này là yếu tố ngẫu nhiên

+0

mã sẽ hiển thị như thế nào? không chắc chắn cách viết điều đó :) – user1213488

+0

1. Google "System.Random". 2. Xem xét các mẫu tài liệu và mã đã được cung cấp sẵn trên web. 3. Tìm hiểu, thay vì sử dụng câu trả lời sao chép/dán. (Tôi đoán hôm nay là một trong những ngày "giật" của tôi.) – David

1

Hoặc có thể là một giải pháp tổng quát hơn đối với bất kỳ đếm

public static class RandomExtensions 
{ 
    private static readonly Random rnd = new Random(); 
    private static readonly object sync = new object(); 

    public static T RandomElement<T>(this IEnumerable<T> enumerable) { 
     if (enumerable == null) 
      throw new ArgumentNullException("enumerable"); 

     var count = enumerable.Count(); 

     var ndx = 0; 
     lock (sync) 
      ndx = rnd.Next(count); // returns non-negative number less than max 

     return enumerable.ElementAt(ndx); 
    } 
} 
+0

'ElementAt' sẽ ném ngoại lệ cho bộ sưu tập trống. –

+2

@lazyberezovsky Nếu ElementAt ném, hơn RandomElement cũng nên ném cùng một ngoại lệ. Nên có một RandomElementOrDefault trong trường hợp này – Vasea

24

một câu trả lời đơn giản như chấp nhận một là có thể mà không liệt kê toàn bộ mảng mỗi khi:

private static readonly Random  random = new Random(); 
private static readonly HashSet<T> hashset = new HashSet<T>(); 

... 

T element = hashset.ElementAt(random.Next(hashset.Count)); 
+6

ElementAt vẫn liệt kê các phần tử cho đến khi nó đạt đến chỉ mục được chỉ định, vì vậy nó sẽ không nhanh hơn. – Zonko

Các vấn đề liên quan