zoukankan      html  css  js  c++  java
  • c# cook book -Linq 关于Object的比较

    实际项目中经常用到 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来确定应用类的一个实例和另一个实例是否相同。通常是不相同的,因为他们指向了不同的内存地址,导致哈希值是不同的。重写以后,认为某些属性值相同则认为相同。

  • 相关阅读:
    Python Scrapy 自动爬虫注意细节(3)
    Python Scrapy 验证码登录处理
    Python Scrapy 自动爬虫注意细节(2)
    Python Scrapy 自动爬虫注意细节(1)
    Python 爬虫知识点
    Android权限全记录(转)
    Python 爬虫知识点
    eclipse的Maven项目pom.xml错误信息提示missingxxxjar解决方案
    Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解
    spark学习系列
  • 原文地址:https://www.cnblogs.com/fuyujian/p/4605035.html
Copyright © 2011-2022 走看看