2012-10-26 38 views
8

Tôi cố gắng để hiểu thêm về LINQ, ví dụ, nếu tôi muốn thực hiện một Select tôi sẽ thực hiện như thế nàyCách triển khai phương thức Linq OrderBy?

public static IEnumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, TResult> selector) 
{ 
    foreach (var item in source) 
    { 
     yield return selector(item); 
    } 
} 

nơi như thế này

public static IEnumerable<TSource> Where<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate) 
{ 
    foreach (var item in source) 
    { 
     if (predicate(item)) 
      yield return item; 
    } 
} 

Làm thế nào về OrderBy?

Trả lời

12

Hãy xem this. Tôi nghĩ bạn sẽ thấy nó rất hữu ích. Về cơ bản, Jon Skeet thực hiện lại mọi thứ trong Linq như một bài tập học tập. Rất thông tin.

Phần thứ hai nói về việc triển khai Where ... v.v. cho đến các phần mô tả OrderBy.

1

Để theo bạn mô hình thực hiện hiện tại bạn có thể thử này:

public static IEnumerable<TSource> OrderBy<TSource, TKey>(
    IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
{ 
    var items = source.ToArray(); 
    var keys = items.Select(keySelector).ToArray(); 
    Array.Sort(keys, items); 
    foreach (var item in items) 
    { 
     yield return item; 
    } 
} 
+2

Đây không phải là một việc thực hiện hợp lệ của 'OrderBy'. Bạn không thể gọi 'ThenBy' về điều này. – Servy

+0

@Servy - Tôi đã nói rằng tôi đã theo mẫu triển khai của OP chứ không phải mẫu chuẩn. Tôi đã nói "đây là cách để thực hiện' OrderBy' "thì tôi sẽ đồng ý với bình luận của bạn. – Enigmativity

+1

Tôi không thấy gì trong OP chỉ ra rằng nó không thực hiện 'OrderBy' đúng cách. Điều gì về nó chỉ ra rằng bạn không nên cung cấp một thực hiện đó là ít nhất một chức năng tương đương của phiên bản BCL? – Servy

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