Đôi khi bạn không có khả năng lập chỉ mục hoặc có lẽ bạn muốn đảo ngược kết quả của truy vấn Linq hoặc có thể bạn không muốn sửa đổi bộ sưu tập nguồn, nếu bất kỳ điều nào trong số này là đúng, Linq có thể giúp bạn.
Phương thức mở rộng Linq sử dụng các loại ẩn danh với Linq Chọn để cung cấp khóa sắp xếp cho Linq OrderByDesceinating;
public static IEnumerable<T> Invert<T>(this IEnumerable<T> source)
{
var transform = source.Select(
(o, i) => new
{
Index = i,
Object = o
});
return transform.OrderByDescending(o => o.Index)
.Select(o => o.Object);
}
Sử dụng:
var eable = new[]{ "a", "b", "c" };
foreach(var o in eable.Invert())
{
Console.WriteLine(o);
}
// "c", "b", "a"
Nó được đặt tên là "Đảo ngược" vì nó đồng nghĩa với "Đảo ngược" và cho phép định hướng với việc thực hiện Danh sách đảo ngược.
Cũng có thể đảo ngược một số phạm vi nhất định của bộ sưu tập, vì Int32.MinValue và Int32.MaxValue nằm ngoài phạm vi của bất kỳ loại chỉ mục bộ sưu tập nào, chúng tôi có thể tận dụng chúng cho quy trình đặt hàng; nếu một chỉ số phần tử nằm dưới phạm vi đã cho, nó được gán Int32.MaxValue để thứ tự của nó không thay đổi khi sử dụng OrderByDesceinating, tương tự, các phần tử tại một chỉ mục lớn hơn phạm vi đã cho, sẽ được gán Int32.MinValue, để chúng xuất hiện đến cuối quá trình đặt hàng. Tất cả các yếu tố trong phạm vi nhất định được gán chỉ số bình thường của chúng và được đảo ngược tương ứng.
public static IEnumerable<T> Invert<T>(this IEnumerable<T> source, int index, int count)
{
var transform = source.Select(
(o, i) => new
{
Index = i < index ? Int32.MaxValue : i >= index + count ? Int32.MinValue : i,
Object = o
});
return transform.OrderByDescending(o => o.Index)
.Select(o => o.Object);
}
Sử dụng:
var eable = new[]{ "a", "b", "c", "d" };
foreach(var o in eable.Invert(1, 2))
{
Console.WriteLine(o);
}
// "a", "c", "b", "d"
Tôi không chắc chắn về lượt truy cập hiệu suất của các triển khai Linq này so với việc sử dụng Danh sách tạm thời để bọc bộ sưu tập để đảo ngược.
Tại thời điểm viết bài, tôi không biết về việc triển khai Reverse của chính Linq, tuy nhiên, thật vui khi làm việc này.
https://msdn.microsoft.com/en-us/l Library / vudio / bb58497 (v = vs.100) .aspx