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

  • 相关阅读:
    如何获得浏览器localStorage的剩余容量
    按Enter键后Form表单自动提交的问题
    IE10 11的css hack
    text-transform设置单词首字母大写
    Jade模板引擎(一)之Attributes
    sql server之ROW_NUMBER() OVER()取每组的第N行数据
    CSS3之让背景图片全部显示
    摆脱npm的网络问题: 淘宝npm镜像
    MaskedTextBox的聚焦和光标位置
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/fuyujian/p/4605035.html
Copyright © 2020-2023  润新知