2013-05-09 189 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); 
    } 
}