2009-10-22 32 views
8

Gần đây tôi đã gặp phải một câu hỏi phỏng vấn liên quan đến LINQ.Chuỗi rỗng trong LINQ

Việc sử dụng chuỗi rỗng là gì? .He hỏi "nếu tôi giả sử yêu cầu bạn sử dụng trình tự, bạn thích nó ở đâu?"

 public static IEnumerable<TResult> Empty<TResult>() 
    { 
     yield break; 
    } 

Tôi không trả lời. Trợ giúp được đánh giá cao.

+2

như thế nào chuỗi rỗng hình thành? Làm thế nào để bạn phù hợp với nó? – Will

+0

+1 cho một câu hỏi hay trong quan điểm của tôi. –

+0

@Stan Tôi phải nói với bạn rất nhiều cảm ơn vì đã xóa bỏ sự nghi ngờ của tôi. –

Trả lời

3

Bạn có thể sử dụng khi bạn muốn nhanh chóng tạo ra một IEnumerable<T> cách này bạn không cần phải tạo ra một tham chiếu đến một mới List<T> và tận dụng lợi thế của năng suất từ khóa.

List<string[]> namesList = 
    new List<string[]> { names1, names2, names3 }; 

// Only include arrays that have four or more elements 
IEnumerable<string> allNames = 
    namesList.Aggregate(Enumerable.Empty<string>(), 
    (current, next) => next.Length > 3 ? current.Union(next) : current); 

Lưu ý việc sử dụng Liên minh vì nó không phải là một danh sách bạn không thể gọi Thêm phương pháp, nhưng bạn có thể gọi Liên minh trên một IEnumerable

+0

Bạn có thể nhận được hiệu suất tốt hơn bằng cách sử dụng Concat thay vì Union, trừ khi bạn thực sự cần phải loại trừ trùng lặp. –

+2

Cách nhanh nhất để tham gia một loạt các danh sách như vậy bằng cách sử dụng LINQ là namesList.SelectMany (list => list.Length> 4? List: Enumerable.Empty ()). Làm nó với Tổng hợp và Liên minh là cực kỳ không hiệu quả. Tổng hợp và Concat là tốt hơn nhưng vẫn là O (Nsquared) và O (N) không gian. SelectMany/Distinct là không gian O (N) và O (1) (chỉ có 3 đối tượng được tạo). –

4

Nếu bạn có một vòng lặp tổng hợp các tập hợp khác nhau thành tập hợp kết quả, bạn có thể sử dụng nó để khởi tạo biến tập kết quả của bạn và lặp/tích lũy. Ví dụ:

IEnumerable<string> results = Enumerable.Empty<string>(); 

for(....) 
{ 
    IEnumerable<string> subset = GetSomeSubset(...); 

    results = results.Union(subset); 
} 

Không Rỗng bạn phải đã viết một kiểm tra null thành logic vòng lặp của bạn:

IEnumerable<string> results = null; 

for(....) 
{ 
    IEnumerable<string> subset = GetSomeSubset(...); 

    if(results == null) 
    { 
     results = subset; 
    } 
    else 
    { 
     results = results.Union(subset); 
    } 
} 

Nó không chỉ phải là một kịch bản lặp và nó không phải là Liên minh (có thể là bất kỳ chức năng tổng hợp nào), nhưng đó là một trong những ví dụ phổ biến hơn.

+0

Cảm ơn bạn rất nhiều đã vẽ ví dụ tuyệt vời tuyệt vời –

+0

Câu trả lời hay cho câu hỏi đặt ra. Người đọc nên lưu ý rằng nhận xét hiệu suất của tôi ở trên cũng áp dụng cho mã này. Sử dụng Union theo cách này là O (Nsquared) bởi vì nó tạo ra một Set cho mỗi union và điền nó với tất cả các chuỗi cho đến nay. Tôi đoán đó là kỹ thuật O (NM). Vấn đề là nó rất chậm và SelectMany/Distinct tốt hơn nhiều cho loại kịch bản này. –

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