2012-02-16 39 views
5

Tôi muốn có một mã LINQ sạch đẹp có thể nhận được một mảng giá trị chỉ mục của 1000 giá trị lớn nhất trong một mảng.Nhận giá trị chỉ mục mảng của 1000 mục lớn nhất trong một mảng bằng LINQ

Ví dụ:

int[] IndexArray = ArrayWithValues.Return_Indexes_Of_1000_Biggest_Values 

Mã này rõ ràng là không có thật nó chỉ là để minh họa những gì tôi cần.

CẬP NHẬT

Tôi hoàn toàn quên nói rằng tôi cần một chức năng thứ hai. Tôi có một mảng thứ hai, và tôi cần phải lấy tất cả các giá trị trong mảng thứ hai có cùng các chỉ mục như được chứa bên trong IndexArray.

Tôi có thể làm điều đó dễ dàng bằng cách sử dụng vòng lặp và tất cả điều đó nhưng mã lớn, và tôi muốn học cách sử dụng LINQ thường xuyên hơn nhưng tại thời điểm LINQ vẫn còn rất xa lạ với tôi.

Tôi đã trải qua các câu hỏi tương tự được yêu cầu ở đây nhưng tôi không thể sửa đổi mã để phù hợp với nhu cầu của mình, vì mọi người thường chỉ cần giá trị chứ không phải chỉ mục của các giá trị.

Cảm ơn sự giúp đỡ!

+0

Để cập nhật: 'var itemsFromSecondArray = indexArray.Select (i => secondArray [i]). ToArray()', hoặc bạn chỉ có thể chọn chúng ra khỏi biểu thức 'indexArray' nếu bạn không thực sự cần' indexArray' nếu không. – Rup

Trả lời

7

Điều gì đó như thế này sẽ hoạt động. Nó sử dụng quá tải của Select cho phép bạn kết hợp đầu vào thứ hai là chỉ mục của mục trong chuỗi.

var indexArray = sourceArray 
        .Select((value, index) => new { value, index }) 
        .OrderByDescending(item => item.value) 
        .Take(1000) 
        .Select(item => item.index) 
        .ToArray(); 

Chỉ cần dự đoán giá trị và chỉ mục vào một đối tượng, theo thứ tự giá trị, lấy 1000 mục hàng đầu, sau đó chọn chỉ mục trước khi chuyển đổi thành mảng.

Thử nghiệm bằng cách lấy 5 chỉ mục hàng đầu từ mảng { 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 } sản lượng { 0, 8, 3, 9, 2 }, ánh xạ tới giá trị { 10, 9, 8, 7, 6 }.


Theo các ý kiến ​​đã đề cập liên quan đến cập nhật của bạn, bạn chỉ có thể lấy những chỉ số để chọn từ khác nếu bạn tự tin các mảng đều bình đẳng trong chiều dài hoặc sẽ khác không dẫn đến một IndexOutOfBoundsException.

.Select(item => otherArray[item.index]) 
.ToArray(); 

Phương pháp khác bạn có thể tra cứu sẽ là Enumerable.Zip.

+0

Cảm ơn bạn đã làm việc này, nhưng tôi hoàn toàn quên tôi cần phải có một cái gì đó khác sau đó xin vui lòng đọc các cập nhật – user1035217

+2

@ user1035217: chỉ cần thay đổi cuối 'Select' thành' Select (item => otherArray [item.index]) '. –

+0

Mmm nghĩ rằng nó sẽ dễ dàng như vậy. Linq thực sự tuyệt vời. Cảm ơn! – user1035217

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