Vâng đơn giản - nhưng không hiệu quả - cách sẽ là:
var result = _lstNeedToOrder.OrderBy(x => _lstOrdered.IndexOf(x));
Một thay thế sẽ được làm việc ra một cách xa có được chỉ số mong muốn của một giá trị. Nếu giá trị của bạn luôn nằm trong phạm vi [1 ... n], bạn có thể đảo ngược danh sách "đã sắp xếp" đó thành "danh sách chỉ mục theo giá trị". Lúc này bạn có thể sử dụng:
var result = _lstNeedToOrder.OrderBy(x => indexes[x]);
(nơi indexes
sẽ có một giá trị thêm vào lúc bắt đầu cho 0, chỉ để làm cho mọi việc đơn giản hơn).
Hoặc, bạn có thể tạo Dictionary<int, int>
từ giá trị đến chỉ mục. Đó sẽ là tổng quát hơn, trong đó nó sẽ xử lý một phạm vi rất rộng các giá trị mà không cần tốn nhiều bộ nhớ. Nhưng tra cứu từ điển rõ ràng là kém hiệu quả hơn so với tra cứu mảng hoặc danh sách.
Cũng giống như một lưu ý bên đó sẽ không định dạng cũng như nhận xét, khởi tạo của bạn có thể được đơn giản hóa bằng cách sử dụng khởi tạo bộ sưu tập:
var listToOrder = new List<int> { 1, 5, 6, 8 };
var orderedList = new List<int> { 13, 5, 11, 1, 4, 9, 2, 7, 12, 10, 3, 8, 6 };
Nguồn
2013-08-04 07:19:09
Xin chào Jon, xin lỗi Nếu đó là câu hỏi ngớ ngẩn, nhưng tại sao câu hỏi không hiệu quả đầu tiên? –
@DimitarDimitrov: Nó sử dụng 'IndexOf' để tìm chỉ mục mong muốn của mỗi mục nhập. Đó là một hoạt động O (n) trên kích thước của '_lstOrdered', không cần thiết. –
@DimitarDimitrov có thể vì sử dụng 'IndexOf'? –