开发者

Operator overloading in Linq queries

Operator overloading is working perfect in C# code, since I am trying in the following way.

**

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;
        }
    }**

I have a clas called HostCode and it contains 2 overloading methods (one for '==' and another for '!=') An开发者_如何学Pythond I created a collection of Host Codes below.

        **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;***

when I am trying like above, the respective operator method fired in HostCode class (in this case it is '=='). So that I can write my custom logic there.

But if Iam trying with a Linq query as below, it is not firing. But in this case also Iam comparing 2 objects having same type.

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

Can anyone please help me to find out a way which I can compare 2 objects by Linq queries?


You can use IEqualityComparer or override equals for this purpose.

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;
        }
}

And IEqualityComparer usage is when you have some equality on object and in some functions like Contain, ... you want use some specific equality:

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();
    }
}


Since your question is "how should I compare them for this to work" I would answer "you should overload and use .Equals() instead of =="

And what's with your overload definition of !=?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜