Linq查询中的运算符重载

时间:2011-03-02 14:53:50

标签: linq

运算符重载在C#代码中工作得很好,因为我正在尝试以下方式。

**

public class HostCode 
    {
        public string Code { get; set; }
        public string Name { get; set; }
        public static bool operator ==(HostCode hc1, HostCode hc2)
        {
            return hc1.Code == hc2.Code;
        }
        public static bool operator !=(HostCode hc1, HostCode hc2)
        {
            return true;
        }
    }**

我有一个名为HostCode的clas,它包含2个重载方法(一个用于'==',另一个用于'!=') 我在下面创建了一系列主机代码。

        **var hostCodes = new List<HostCode>()
        {
            new HostCode(){ Code = "1", Name = "sreekanth" },
            new HostCode(){ Code = "2", Name = "sajan" },
            new HostCode(){ Code = "3", Name = "mathew" },
            new HostCode(){ Code = "4", Name = "sachin" }
        };**

        ***var hc = new HostCode() { Code = "1", Name = "sreekanth" };***

        ***var isEq = hostCodes[1] == hc;***

当我在上面尝试时,在HostCode类中触发了相应的运算符方法(在这种情况下它是'==')。这样我就可以在那里编写自定义逻辑。

但如果Iam尝试使用Linq查询,则不会触发。但在这种情况下,我也比较了两个具有相同类型的对象。

**var isEqual = from obj in hostCodes where (HostCode)obj == (HostCode)hc select obj;**

任何人都可以帮我找一个可以通过Linq查询比较2个对象的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用IEqualityComparer或覆盖equals来实现此目的。

public class HostCode 
{
....
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            return obj as HostCode == null ? false : (obj as HostCode).Code == Code;
        }
}

IEqualityComparer的用法是当你在对象和某些函数(如Contain)上有一些相等性时......你想要使用某些特定的相等:

public class EqualityComparer : IEqualityComparer<HostCode >
{

    public bool Equals(HostCode x, HostCode y)
    {
        return y.ID == x.ID;
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

答案 1 :(得分:0)

由于您的问题是“我应该如何比较它们才能实现这一目标”我会回答“您应该重载并使用.Equals()代替==

您的重载定义!=是什么?