2013-05-09 175 views
0

我有實體是如下比較兩個列表C#

public class A 
{ 
    public virtual int Id { get; set; } 
    public virtual string AccountName { get; set; } 
    public virtual string AccountId { get; set; } 
    public virtual Status Status { get; set; } 
    public virtual IList<Service> Services { get; set; } 
} 

我還有一個列表,它的類型是服務,我想與實體A.Services進行比較,並只得到這是符合這些A的結果(一樣)。

我想一個lambda明示或某種方式

+0

使用'Intersect' – noobob 2013-05-09 08:32:46

+0

「匹配」....? – Jon 2013-05-09 08:34:20

回答

2

你可以有你的類實現IEquatable,然後使用Linq相交。

public class A : IEquatable<A> 
{ 
    public virtual int Id { get; set; } 
    public virtual string AccountName { get; set; } 
    public virtual string AccountId { get; set; } 
    public virtual Status Status { get; set; } 
    public virtual IList<Service> Services { get; set; } 

    //Implement IEquatable interfaces 
    //... 
} 

注意,使用LINQ路口呼叫時,請使用以下之一:

public static IEnumerable<TSource> Intersect<TSource>(
      this IEnumerable<TSource> first, 
      IEnumerable<TSource> second, 
      IEqualityComparer<TSource> comparer) // <--- This is important 
+0

謝謝大衛,但我是新的使用這種類型的東西IEqualityComparer 比較)。如果可能的話,請給出一個示例代碼。 – user1394622 2013-05-09 08:54:58

+0

@ user1394622,你可以看一下http://xinyustudio.wordpress.com/2009/11/26/ling-operation-union-intersect-except-and-iequatablet/,看一個例子如何判斷兩個點是一樣的。祝你好運 – David 2013-05-09 09:04:10

1

可以使用Enumerable.Intersect方法。

通過使用默認的 相等比較器來比較值,生成兩個序列的集交集。

public class A : IEquatable<Service> 
{ 
    public virtual int Id { get; set; } 
    public virtual string AccountName { get; set; } 
    public virtual string AccountId { get; set; } 
    public virtual Status Status { get; set; } 
    public virtual IList<Service> Services { get; set; } 
} 

var commonListofService = services1.Intersect(services2); 
0

爲什麼不直接對A類的方法,做它,那麼你並不需要IEquatable打擾。 ...

public class A 
{ 
    public virtual int Id { get; set; } 
    public virtual string AccountName { get; set; } 
    public virtual string AccountId { get; set; } 
    public virtual Status Status { get; set; } 
    public virtual IList<Service> Services { get; set; } 

    public List<Service> GetCommonServices(A compareTo) 
    { 
     return this.Services.Intersect(compareTo.Services); 
    } 
}