2012-06-17 35 views
7

Tôi muốn thêm hỗ trợ LINQ vào trình phân tích cú pháp (nhị phân, JSON và XML) của tôi để tôi có thể sử dụng SQL như truy vấn trên nó như bạn có thể với System.Xml. Nó hoạt động bằng cách phân tích cú pháp tệp hoàn toàn và lưu nó trên heap. (như System.Xml không).Thêm LINQ vào các lớp của tôi

Tôi đã được Googling và dường như không hiểu bất kỳ điều gì trong số đó (tôi nhận được rất nhiều Using LINQ to SQL Classes trang). Hướng dẫn trên MSDN, tôi cũng không hiểu. Tôi cần phải làm gì?

Trả lời

17

Thực hiện LINQ đơn giản nghĩa là triển khai các phương thức LINQ dự kiến ​​sẽ ở đó, chẳng hạn như Where hoặc Select, với chữ ký chính xác. Mặc dù nhận thức chung, bạn không phải triển khai giao diện IEnumerable cho lớp của mình để hỗ trợ LINQ. Tuy nhiên, việc triển khai IEnumerable sẽ tự động giúp bạn hoàn thành toàn bộ các phương pháp LINQ trên lớp học Enumerable gần như miễn phí - bạn chỉ phải triển khai GetEnumerator và lớp IEnumerator.

Có một vài ví dụ về cách triển khai IEnumerable trên blog của tôi, trong bài đăng này về the Iterator pattern.

Tuy nhiên, nếu nó không có ý nghĩa đối với lớp học của bạn để được liệt kê, bạn không cần phải làm như vậy. Bạn chỉ cần triển khai trực tiếp các phương thức LINQ thích hợp. LINQ không thực sự quan tâm làm thế nào các phương thức được xác định, miễn là các biên dịch C#. Nghĩa là, nếu bạn viết:

from p in myPlist where p.Thing == "Thing" select p; 

các biên dịch C# dịch này thành:

mpPlist.Where(p => p.Thing == "Thing").Select(p => p); 

Chừng nào mà biên dịch, LINQ sẽ làm việc. Để xem các chữ ký chính xác cho các phương thức, hãy xem như tài liệu MSDN list of LINQ query methods. Ví dụ (giả sử rằng PList của bạn là một danh sách các PListItem s):

public class PList 
{ 
    public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate) 
    { 
    foreach (var item in this.items) 
    { 
     if (predicate(item)) 
     { 
     yield return item; 
     } 
    } 
    } 
} 

Trong khi thực hiện LINQ trực tiếp theo cách này cung cấp cho bạn kiểm soát nhiều hơn trong cách ứng xử, đó là một nhiều nhiều việc để có được nó đúng, và bạn cần hiểu ý nghĩa của các giá trị trả về của bạn, và chuỗi các cuộc gọi LINQ, v.v. Nói chung, nếu bạn có thể loại bỏ việc thực hiện lớp học của mình IEnumerable và để C# thực hiện tất cả công việc cho bạn, mọi thứ trở nên dễ dàng hơn nhiều.

+2

btw, bài đăng blog hay! –

1

Vì LINQ đối tượng hoạt động với bất kỳ lớp nào kế thừa từ IEnumerable<t>, bằng cách kế thừa giao diện đó trong lớp của bạn và xác định phương thức GetEnumerable là đủ.

Các liên kết sau đây giải thích về cách thực hiện các giao diện IEnumerable (mặc dù nó không đề cập đến LINQ, nó sẽ làm việc): http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/

1

Bạn phải thực hiện IEnumerable đầu tiên. Đọc phần đầu tiên - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

+0

thực hiện như trong kế thừa? –

+0

Vào С # bạn phải khai báo nó như kế thừa và thực hiện tất cả các thành viên, được định nghĩa trong giao diện. Ví dụ:nếu bạn có giao diện _IBoostable_ trong đó có phương pháp với mô tả Boost _void (int nhân); _, bạn phải viết một cái gì đó như thế 'class MyClass: IBoostable { public void Boost (int multiplier) { doSomething (nhân); } } ' –

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