2008-10-31 20 views
11

Tôi đã đọc một bài viết trên tạp chí MSDN về việc sử dụng Enumerable class in LINQ để tạo một mảng ngẫu nhiên. Bài báo sử dụng VB.NET và tôi không chắc chắn những gì ngay lập tức tương đương với là trong C#:Mảng ngẫu nhiên sử dụng LINQ và C#

Dim rnd As New System.Random() 
Dim numbers = Enumerable.Range(1, 100). _ 
    OrderBy(Function() rnd.Next) 

Trả lời

20

các Developer Fusion VB.Net to C# converter nói rằng C# code tương đương là:

System.Random rnd = new System.Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next()); 

Để tham khảo trong tương lai , họ cũng có một số C# to VB.Net converter. Có sẵn several other tools cho điều này.

+0

được chỉnh sửa làm tổ hợp của mọi người. đây là câu trả lời hàng đầu vào thời điểm đó. Tôi không chơi yêu thích, chỉ cần giữ nó sạch sẽ. – TheSoftwareJedi

+0

Được rồi, cảm ơn vì đã cho tôi biết. Chỉ để tham khảo, đây là mã của James Curran. – HanClinto

5
Random rnd = new Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next()); 
+0

Hmmm, tôi nhận được: Hmmm, tôi nhận được: Các đối số kiểu cho phương thức 'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable , System.Func ) 'không thể suy ra từ cách sử dụng. Hãy thử xác định các đối số kiểu một cách rõ ràng. – Ryan

+0

@Ryan: thiếu số parens – Jimmy

1

tốt nhất tôi có thể làm ra khỏi đỉnh đầu của tôi không được tiếp cận với Visual Studio (đi qua ngón tay):

System.Random rnd = New System.Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next); 
5

ban đầu tôi nghĩ đây sẽ là một ý tưởng tồi vì thuật toán sắp xếp sẽ cần phải làm nhiều việc so sánh cho các con số, và nó sẽ nhận được một khóa phân loại khác nhau cho cùng một số mỗi khi nó gọi lambda cho số đó. Tuy nhiên, có vẻ như nó chỉ gọi nó một lần cho mỗi phần tử trong danh sách và lưu trữ giá trị đó để sử dụng sau này. Mã này chứng tỏ điều này:

int timesCalled = 0; 
Random rnd = new Random(); 

List<int> numbers = Enumerable.Range(1, 100).OrderBy(r => 
    { 
     timesCalled++; 
     return rnd.Next(); 
    } 
).ToList(); 

Assert.AreEqual(timesCalled, 100); 
1

Sử dụng C5 Generic Collection Library, bạn chỉ có thể sử dụng được xây dựng trong Shuffle() phương pháp:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100)); 
numbers.Shuffle(); 
+0

Tôi thích nó. Tốt đẹp. – Ryan

4

gì về điều gì đó xa dễ dàng hơn ...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString()) 
Các vấn đề liên quan