2011-04-25 69 views
2
class Customer : IEquatable<Customer> 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string ZipCode { get; set; } 

    public bool Equals(Customer other) 
    { 
     if (ReferenceEquals(null, other)) return false; 

     return this.FirstName.Equals(other.FirstName) && this.LastName.Equals(other.LastName) 
      && this.ZipCode.Equals(other.ZipCode); 
    } 

    public override bool Equals(object obj) 
    { 
     return this.Equals(obj as Customer); 
    } 

    public override int GetHashCode() 
    { 
     return this.FirstName.GetHashCode()^this.LastName.GetHashCode(); 
    } 
} 

static void Main(string[] args) 
{ 
    List<Customer> allCustomers = new List<Customer>(); 
    allCustomers.Add(new Customer { FirstName = "A", LastName = "V", ZipCode = "11111" }); 
    allCustomers.Add(new Customer { FirstName = "B", LastName = "W", ZipCode = "11111" }); 
    allCustomers.Add(new Customer { FirstName = "C", LastName = "X", ZipCode = "22222" }); 
    allCustomers.Add(new Customer { FirstName = "D", LastName = "Y", ZipCode = "33333" }); 
    allCustomers.Add(new Customer { FirstName = "E", LastName = "Z", ZipCode = "33333" }); 

    List<Customer> subList = new List<Customer>(); 
    subList.Add(new Customer { FirstName = "A", LastName = "V", ZipCode = "11111" }); 
    subList.Add(new Customer { FirstName = "B", LastName = "W", ZipCode = "11111" }); 
    subList.Add(new Customer { FirstName = "C", LastName = "X", ZipCode = "22222" }); 

    //This gives expected answer 
    var n = subList.Except(allCustomers).ToList(); 

    //This should compare only for those customers who zip matches with Sublist's zip 
    //This returns customers with zip code "33333" while it should not 
    var v = allCustomers.Except(subList).ToList(); 
} 

var V不应该返回邮政编码为“33333”的客户。我如何进行比较,以便忽略Zip列表中不存在的那些客户?不存在的比较列表和返回对象

+0

这将是LINQ加入的经典案例。我碰巧不喜欢Linq Joins的语法,这导致我不能从内存中得出答案:) – sehe 2011-04-25 19:35:30

+0

另外,我认为如果哈希码包含邮政编码会更好;另请参阅http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode有关实施GetHashCode的一般建议 – sehe 2011-04-25 19:41:04

+0

这似乎对我工作正常。 {A,B,C,D,E} - {A,B,C} = {D,E} ...我错过了什么吗? – 2011-04-25 19:41:38

回答

4
var zipCodes = subList.Select(c=> c.ZipCode).Distinct().ToList(); 
var v = allCustomers.Where(c=> zipCodes.Contains(c.ZipCode)) 
        .Except(subList) 
        .ToList(); 
0

你为什么说V不应该包含邮编33333? allCustomers - subList将删除共同元素,但保留所有客户的独特元素。

这是一组差,所以{A,B,C,d,E} - {A,B,C} = {d,E}因此33333应显示...

似乎类似于这个例子来自MSDN:http://msdn.microsoft.com/en-us/library/bb300779.aspx

+0

好吧,所以我猜这不是一个问题,除了如何获得用户想要的元素。我的回答更多地提到“var v不应该带着33333 zip返回客户”,就好像除了不能正常工作。现在回想起来,这是一个什么查询会给他想要的东西的问题。 – 2011-04-25 19:47:21