2012-08-27 40 views
5

chúng tôi có thiết lập sau: Chúng tôi có một mảng đối tượng có chuỗi trong đó (xml-ish nhưng không được chuẩn hóa) và chúng tôi có danh sách/mảng chuỗi có id .C# LINQ, Tìm kiếm các mục giống nhau trong hai danh sách

Chúng tôi cần tìm hiểu xem một chuỗi từ danh sách đó có id cũng là nhấn vào một trong các đối tượng hay không.

Ở đây chúng ta có một thiết lập mà chúng tôi đã cố gắng:

public class Wrapper 
{ 
    public string MyProperty { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Wrapper> wrappers = new List<Wrapper>() 
     { 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>3</id><sqjldkjlfdskjlkfjsdklfj>"}, 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj>"} 
     }; 
     string[] ids = { "<id>0</id>", "<id>1</id>", "<id>2</id>" }; 

     var props = wrappers.Select(w => w.MyProperty); 
     var intersect = props.Intersect(ids, new MyEquilityTester()); 
     Debugger.Break(); 
    } 
} 

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

Edit:

gì chúng tôi mong đợi là khi chúng ta làm một .Any() trên intersect đó là nói true vì giấy gói có một đối tượng với một prop có chứa <id>2</id>, intersectnull.

Nếu chúng tôi sử dụng sai phương pháp, vui lòng nói. Nó sẽ hoạt động nhanh như posible. Một đơn giản true khi tìm thấy sẽ làm!

+1

Câu hỏi của bạn là gì? –

+0

@DanielHilgarth tôi đã cập nhật bài viết – Frederiek

+0

Điều tốt nhất để làm ở đây là phân tích cú pháp văn bản trong 'MyProperty' thành cấu trúc dễ đọc/thân thiện/dễ bảo trì hơn. – devundef

Trả lời

6

Đối với trường hợp của bạn, bạn có thể viết IEqualitycomparer của bạn như thế này:

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y) || y.Contains(x); 
    } 

    public int GetHashCode(string obj) 
    { 
     return 0; 
    } 
} 

và nó sẽ tìm thấy

<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj> 

này hoạt động vì GetHashCode luôn luôn trả 0, và x.Contains(y) || y.Contains(x) séc.


Một giải pháp không-để-hacky là sử dụng một Where kết hợp với Any

IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i))); 

hoặc thay thế Where với Any khác nếu bạn không quan tâm đến các mặt hàng thực tế và bạn chỉ muốn một số true hoặc false.

bool intersect = props.Any(p => ids.Any (i => p.Contains(i))); 
+0

Thx rất nhiều người đàn ông, nó hoạt động! – Frederiek

1
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i))) 
Các vấn đề liên quan