首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IEquatable上重写等于

在IEquatable上重写等于
EN

Stack Overflow用户
提问于 2014-11-04 14:29:45
回答 3查看 127关注 0票数 1

为了查看其他人的详细信息,我尝试使用以下方法来阻止人们更改querystring

代码语言:javascript
复制
public static bool IsCurrentUserAuthorisedVessel(HttpRequest request)
{
    Guid currentUser = GetCurrentUserId();
    PersonRepository repo = new PersonRepository();
    VesselRepository vesselRepo = new VesselRepository();

    Person currentPerson = repo.GetPersonByUser(currentUser);
    int qs = int.Parse(request.QueryString["VesselId"]);
    Vessel currentVessel = vesselRepo.GetVessel(qs);

    if (!String.IsNullOrEmpty(request.QueryString["VesselId"]))
    {       
        if (IsCurrentUserAdmin())
        {
            return true;  //Always return true for admin                  
        }
        else
        {
            if (currentPerson.Vessels.Contains(currentVessel))
            {
                return true;
            }
            else
                return false;
        }                
    }
    return true;
}

在这个示例中,我目前正在调试currentPerson.Vessels在一个Icollection<Vessel>中生成3个容器,其中一个容器的VesselId值为6,也恰好是currentVessel的VesselId,但是匹配失败了,方法正在返回false

我已经对类似的问题和MSDN文档做了一些阅读,我对这里发生的事情的理解是因为在ICollection中ID为6的容器是我试图匹配的currentVessel的不同实例,引用导致不相等,并且与平等规则有关的事情不是基于ID的。

我的Person模型包含public virtual ICollection<Vessel> Vessels { get; set; },这是否意味着我必须在public virtual ICollection<Vessel> Vessels { get; set; }模型上实现IEquatable接口,然后重写IEquatable方法。

在这种情况下,我想要基于id的自己的自定义规则。如何重写此方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-04 14:34:05

在这种情况下重写Equals似乎有点过分,为什么不直接这么做呢?

代码语言:javascript
复制
currentPerson.Vessels.Any(x => x.ID == currentVessel.ID)
票数 3
EN

Stack Overflow用户

发布于 2014-11-04 14:41:36

“james”建议的解决方案不是最佳实践。在这里,如果您有一个应该添加到Hashset<Vessel>中的容器的长列表,那么因为它将在GetHashCode上索引,而.Any是一种扩展方法,应该遍历所有元素来找到正确的元素,而代价将是O(n)

你可以做这样的事

代码语言:javascript
复制
public class Vessel : IEquatable<Vessel>
    {
        public int Id { get; set; }

        public bool Equals(Vessel other)
        {
            return Id == other.Id ; 
        }

        public override int GetHashCode()
        {
            return Id;
        }
        public override bool Equals(object obj)
        {
            var vessel = obj as Vessel;
            return vessel != null && vessel.Id == this.Id;
        }
    }

更新

我之所以说这不是最好的实践,是因为OP说他有一个ICollection<Vessel>,可以转换成许多泛型集合,比如List<T>

来自MSDN

当调用许多泛型集合对象的搜索方法时。其中一些类型及其方法包括:

  • BinarySearch方法的一些泛型重载。
  • List类的搜索方法,包括List.Contains(T)、List.IndexOf、List.LastIndexOf和List.Remove。
  • 字典类的搜索方法,包括ContainsKey和Remove。泛型LinkedList类的搜索方法,包括LinkedList.Contains和Remove。
票数 2
EN

Stack Overflow用户

发布于 2014-11-04 14:40:51

变化

代码语言:javascript
复制
if (currentPerson.Vessels.Contains(currentVessel))
{
    return true;
}
else
    return false;

代码语言:javascript
复制
return currentPerson.Vessels.Any(x => x.ID == currentVessel.ID)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26737633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档