码迷,mamicode.com
首页 > Windows程序 > 详细

c# cook book -Linq 关于Object的比较

时间:2015-06-28 08:38:38      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

实际项目中经常用到 Union,Distinct,INtersect,Execpt对列表进行处理

一般来说要首先重写 Equals 和GetHashCode方法

首先看为重写的情况:

namespace LinqCookBook
{
    class Program
    {
        static void Main(string[] args)
        {
            var model1 = new List<model>
            {
                new model(){name = "1"},
                new model(){name="2"},
                new model(){name = "3"}
            };

            var model2 = new List<model>
            {
                new model() {name = "1"},
                new model() {name = "2"},
                new model() {name = "3"}
            };

            var list = model1.Union(model2).Distinct();
            foreach (var item in list)
            {
                Console.WriteLine(item.name);
            }
        }
    }

    public class model
    {
        public string name { get; set; }

        //public override bool Equals(object obj)
        //{
        //    return obj.GetHashCode().Equals(this.GetHashCode());
        //}

        //public override int GetHashCode()
        //{
        //    return this.name.GetHashCode();
        //}
    }
}

运行结果:

 

重写后:

namespace LinqCookBook
{
    class Program
    {
        static void Main(string[] args)
        {
            var model1 = new List<model>
            {
                new model(){name = "1"},
                new model(){name="2"},
                new model(){name = "3"}
            };

            var model2 = new List<model>
            {
                new model() {name = "1"},
                new model() {name = "2"},
                new model() {name = "3"}
            };

            var list = model1.Union(model2).Distinct();
            foreach (var item in list)
            {
                Console.WriteLine(item.name);
            }
        }
    }

    public class model
    {
        public string name { get; set; }

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

        public override int GetHashCode()
        {
            return this.name.GetHashCode();
        }
    }
}

运行结果:

 

原因:

当元素比较时,会使用默认规则比较,通过equals和gethashcode来确定应用类的一个实例和另一个实例是否相同。通常是不相同的,因为他们指向了不同的内存地址,导致哈希值是不同的。重写以后,认为某些属性值相同则认为相同。

 

c# cook book -Linq 关于Object的比较

标签:

原文地址:http://www.cnblogs.com/fuyujian/p/4605035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!