【问题标题】:Getting distinct items for a list of address objects from stored procedure从存储过程中获取地址对象列表的不同项
【发布时间】:2014-02-12 10:42:09
【问题描述】:

所以我试图仅从我的列表中获取唯一地址,但由于某种原因 .Distinct 不起作用

我试过了:

 List<Address> addresses = _db.Database.SqlQuery<Address>(
 "GetSampleAddresses @workflow_id, @records ", param1, param2).Distinct().ToList();

还有

 var json = new JavaScriptSerializer().Serialize(addresses.Distinct());

但都没有删除重复项,知道为什么吗?

【问题讨论】:

    标签: c# json entity-framework


    【解决方案1】:

    问题是,当您使用不带参数的.Disctinct() 重载时,它将比较引用库上的对象(通过使用默认相等比较器)。换句话说,两次添加到您的集合中的相同对象将被视为重复,但具有相同字段/属性的两个不同对象将不相等。
    要按特定字段进行比较,您必须提供 IEqualityComparer 来进行比较:

    var json = new JavaScriptSerializer().Serialize(addresses.Distinct(new AddressComparer()));
    

    还有AddressComparer 本身:

    class AddressComparer: IEqualityComparer<Address>
    {
        public bool Equals(Address x, Address y)
        {         
            //Check whether the compared objects reference the same data. 
            if (Object.ReferenceEquals(x, y)) return true;
    
            //Check whether any of the compared objects is null. 
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                 return false;
    
            // Compare properties here. 
            // Assuming that two Addresses are equal when Street and Code are equal.
            return x.Street == y.Street && x.Code == y.Code;
        }    
    
        // If two objects are equal GetHashCode for both should return same value.
        public int GetHashCode(Address address)
        {
            if (Object.ReferenceEquals(address, null)) 
                return 0;
    
            int hashAddress = address.Street == null ? 0 : address.Street.GetHashCode();
            int hashCode = address.Code.GetHashCode();
    
            // Calculate new hash code from unique values combinaiton.
            return hashAddress ^ hashCode;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2015-03-07
      • 2017-01-28
      • 2012-06-14
      相关资源
      最近更新 更多