2012-06-19 40 views
49

Tôi có một danh sách các thông số như thế này:Kiểm tra xem danh sách <t> chứa bất kỳ một danh sách khác

public class parameter 
{ 
    public string name {get; set;} 
    public string paramtype {get; set;} 
    public string source {get; set;} 
} 

IEnumerable<Parameter> parameters; 

Và một mảng các chuỗi tôi muốn kiểm tra xem nó chống lại.

string[] myStrings = new string[] { "one", "two"}; 

Tôi muốn lặp qua danh sách tham số và kiểm tra xem thuộc tính nguồn có bằng bất kỳ mảng myStrings nào không. Tôi có thể làm điều này với foreach lồng nhau nhưng tôi muốn tìm hiểu làm thế nào để làm điều đó một cách đẹp hơn như tôi đã được chơi xung quanh với LINQ và giống như các phương pháp mở rộng trên enumerable như nơi vv nên foresteds lồng nhau chỉ cảm thấy sai. Có một linq/lambda/delegete thích hợp hơn cách để làm điều này.

Cảm ơn

Trả lời

105

Bạn có thể sử dụng một lồng nhau Any() cho việc kiểm tra này trong đó có sẵn trên bất kỳ Enumerable:

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x)); 

nhanh hơn biểu diễn trên các bộ sưu tập lớn hơn sẽ được chiếu parameters-source và sau đó sử dụng Intersect mà trong nội bộ sử dụng HashSet<T> để thay vì O (n^2) cho phương pháp đầu tiên (tương đương với hai vòng lồng nhau), bạn có thể thực hiện kiểm tra trong O (n):

bool hasMatch = parameters.Select(x => x.source) 
          .Intersect(myStrings) 
          .Any(); 

Cũng như một bình luận bên, bạn nên tận dụng tên lớp và tên thuộc tính của mình để tuân thủ nguyên tắc về phong cách C#.

+0

cảm ơn dường như là những gì tôi đang tìm kiếm, tôi sẽ dùng thử. Cần phải chơi xung quanh với mặt chức năng của nhiều thứ hơn một chút. liên quan đến cách viết hoa lớp và tài sản, tôi làm tôi chỉ quên khi viết ví dụ trên. – gdp

+0

Tại sao O (n^2)? Nó không phải là O (n * m) khi chúng ta đang nói về hai biến chứ không phải một biến? Vì m (các tham số) là một hằng số, nó giống như O (n). Tôi không thấy giao lộ nên nhanh hơn nhiều ở đây như thế nào? Nhưng đồng ý, Intersect có tiềm năng để được nhanh hơn, nhưng không được bảo đảm. – Squazz

+0

Bạn đúng rằng nó phải là O (n * m) - m không phải là một hằng số mặc dù - nó là kích thước của một trong các danh sách, mặc dù trong ví dụ cụ thể cho nó có thể là "2". Mặc dù tất cả các danh sách đều có chiều dài ngắn, nhưng nó không quan trọng bằng cách này hay cách khác (trong trường hợp đó có lẽ không phải là mối quan tâm của bạn) anyway) – BrokenGlass

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