首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

检查重复项的通用C#函数(不同的对象,不同的字段)

在C#中,检查重复项通常涉及到比较对象的某些字段是否相等。以下是一个通用的C#函数示例,它可以用于检查不同对象中的不同字段是否存在重复项。这个函数使用了泛型和反射来实现灵活性。

代码语言:txt
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public static class DuplicateChecker
{
    public static bool ContainsDuplicate<T>(IEnumerable<T> items, params string[] fieldNames)
    {
        if (items == null || !fieldNames.Any())
            return false;

        var seen = new HashSet<string>();

        foreach (var item in items)
        {
            var key = GenerateKey(item, fieldNames);
            if (!seen.Add(key))
                return true; // 发现重复项
        }

        return false; // 没有发现重复项
    }

    private static string GenerateKey<T>(T item, string[] fieldNames)
    {
        var keyParts = new List<string>();

        foreach (var fieldName in fieldNames)
        {
            var propertyInfo = typeof(T).GetProperty(fieldName);
            if (propertyInfo == null)
                throw new ArgumentException($"No property named '{fieldName}' on type '{typeof(T).Name}'");

            var value = propertyInfo.GetValue(item)?.ToString();
            keyParts.Add(value ?? string.Empty);
        }

        return string.Join("|", keyParts);
    }
}

基础概念

  • 泛型:允许函数或类在不知道具体类型的情况下编写代码。
  • 反射:允许程序在运行时检查和操作对象的类型和成员。
  • HashSet:一个不允许重复元素的集合。

优势

  • 通用性:可以用于任何类型的对象和字段。
  • 灵活性:通过参数化字段名,可以检查任意组合的字段。
  • 效率:使用HashSet来快速检测重复项。

类型

  • 泛型方法ContainsDuplicate<T> 可以接受任何类型的集合。
  • 字符串键生成GenerateKey 方法根据指定的字段生成唯一的键。

应用场景

  • 数据验证:在数据导入或更新前检查是否有重复记录。
  • 去重处理:在数据处理过程中去除重复的数据项。
  • 业务逻辑:确保数据库中的某些关键字段(如用户名、邮箱)的唯一性。

使用示例

假设有一个Person类,我们想要检查是否有重复的FirstNameLastName组合:

代码语言:txt
复制
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

var people = new List<Person>
{
    new Person { FirstName = "John", LastName = "Doe", Age = 30 },
    new Person { FirstName = "Jane", LastName = "Doe", Age = 28 },
    new Person { FirstName = "John", LastName = "Doe", Age = 30 } // 重复项
};

bool hasDuplicate = DuplicateChecker.ContainsDuplicate(people, "FirstName", "LastName");
Console.WriteLine(hasDuplicate); // 输出: True

可能遇到的问题及解决方法

  • 性能问题:如果集合非常大,反射操作可能会影响性能。可以通过缓存PropertyInfo对象来优化。
  • 字段不存在:如果提供的字段名在类型中不存在,函数会抛出异常。可以通过更严格的输入验证来避免这种情况。
  • 空值处理:函数会将空值视为空字符串,这可能不是预期的行为。可以根据需求调整键的生成逻辑。

通过这种方式,你可以创建一个强大且灵活的工具来检查不同对象中的重复项。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【Z投稿】Zabbix自动发现为不同的监控项设置不同的阈值

    Zabbix自动发现为不同的监控项设置不同的阈值 文| 赵静 Zabbix认证工程师(ZCS),多年Linux运维经验,精通Zabbix开源监控系统的架构、部署、使用和维护,有较强的Shell和Python...实现目标 Zabbix自动发现为不同的监控项设置不同的阈值,达到客户想要的特定效果。 Zabbix监控Linux为例 新增主机,关联模板,众多简单操作就不在这多说了。...直接在自动发现对应的监控项的触发器处设置如下配置: {Test_os_linux:vfs.fs.size[{#FSNAME},pfree].last(0)}的空闲磁盘空间、/home少于25%的空闲磁盘空间、/var少于20%的空闲磁盘空间、/tmp少于45%的空闲磁盘空间,就会生成事件,触发告警。...测试 Zabbix 的主机/、/home、/tmp和/var空闲磁盘空间的阈值将如下图所示。 ? ? ? ?

    1.2K30

    C# AIModelRouter:使用不同的AI模型完成不同的任务

    AIModelRouter AI模型路由,模型的能力有大小之分,有些简单任务,能力小一点的模型也能很好地完成,而有些比较难的或者希望模型做得更好的,则可以选择能力强的模型。为什么要这样做呢?...可以降低AI模型的使用成本,毕竟能力强的模型会更贵一点,省着用挺好的。 Semantic Kernel中可以很简便地使用一个AIModelRouter。...isComplete); } } 来看看现在这个简单的路由规则: image-20250106102824888 当你的提问中包含一个ServiceId的时候,就会选择那个服务ID对应的模型进行回复...实际上这样使用,很容易让AI迷惑,因为我们总是要带上一个ServiceId,如果让AI根据用户的提问,自己决定用哪个模型是更好的。...修改后的Prompt如下: string skPrompt = """ 根据用户的输入,返回最佳服务ID。

    3400

    JS 匿名函数——几种不同的调用方式

    ,函数的调用语句,必须放在函数声明语句之后!!!...原因:检查装载时,会先对show变量及这个匿名函数声明,此时,还未将匿名函数赋值给show变量,如果在表达式之前调用,会报错 show is not a function js代码的执行顺序问题 js...代码在运行时,会分为两大部分———检查装载 和 执行阶段。...检查装载阶段:会先检测代码的语法错误,进行变量、函数的声明 执行阶段:变量的赋值、函数的调用等,都属于执行阶段。 3.自执行函数。这里我总结了8种常用的匿名函数调用方法: //1.使用 !...function(){ document.write('ni hao'); }() //2.无法表明函数与之后的()的整体性,不推荐使用。

    4.2K10

    JavaScript 函数定义的几种不同方式

    在这篇中我们主要将函数的概念和函数声明的几种方式,牵扯到的还有函数中的形参和实参传参的问题,除此之外我们还会说一说 最常用 return 的作用,以及函数中处理参数的 arguments 等。...函数 函数的概念 函数:封装了一段可以被重复调用执行的代码块,通过此代码块可以实现大量代码的重复使用。...” 隔开 作用:因为在函数的内部,某些值不能固定,所以我们可以通过参数在调用函数时传递不同的值进去 注意:需要注意的是,前端中任何的符号,例如 逗号(,) 冒号(:)等 都是英文状态下的。...arguments:它的作用在于当我们不确定有多少个参数传递的时候,前端培训可以用 arguments 来获取,在 js 中 arguments 实际上是它当前函数的一个内置对象,所有的函数都内置了一个...arguments 对象,arguments 中存储了传递的所有实参,arguments 中存储的是伪数组 伪数组: 具有数组 length 的属性 按照索引的方式存储 它没有真正数组的方法 pop(

    76721

    MyBatis 封装Map,返回不同实体的集合对象

    博文发布出发点:   1.现在有一个需求,就是从100个表中获得任意表中的数据,按照正常的思维模式和处理方式,     我们首先会创建100个实体类(累死!)...,然后通过resultType一一对应实体类,这种方式简直...   2.我们不通过创建实体类,来获得一个表中的所有数据,或者部分数据的键值对形式的值,我们该怎么做?...原因是,当我们的resultType写成一个实体类的时候,MyBatis首先会找这个实体类里面的字段,然后根据字段进行映射, 但是我们的Object对象它里面有字段吗???...String就相当于实体类里面的具体属性字段,而Object就是存储值的 所以我们的写法应该是这样的 /*   Warning:     这里边如果是要获取多个值的话就必须写成List select * from data 这样的话我们就可以获得所有的字段名加值的

    2.3K20

    新增非空约束字段在不同版本中的演进

    基于这问题,引申出的NOT NULL字段问题还有不少,也是比较容易忽视的一些细节,例如杨长老最近连续发表过两篇关于NOT NULL字段的文章确实很有启发, 非空字段空值对查询的影响 http://yangtingkun.net...这种新增非空约束字段在不同版本中确实有一些细节的变化,下面做一些简单测试。...11.2.0.1库,可以新增字段,表中已存记录该值确实为空,即允许一个有NOT NULL约束的字段包含NULL值。 ?...关于这新特性的好处,可以参考之前写的 《alter table新增字段操作究竟有何影响?...至此,12c修复了11g中这个非空约束字段允许保存空值的bug,同时又支持11g新增默认值非空字段使用数据字典存储的特性,并且做了扩展支持,满足范围更大了。 小问题隐藏了大智慧。

    3.1K10

    JavaScript中获取对象属性的不同方法

    JavaScript中获取对象属性的不同方法 JavaScript提供了多种方式来获取对象的属性。这些方法可以根据不同的需求和情况来选择使用。...以下是其中一些主要方法: 一、点记法 点记法是最直接的方法。只需在对象后面加上点(.),然后是属性名。...John', age: 30}; console.log(Object.keys(obj)); // 输出 ['name', 'age'] 四、Object.values()方法 这个方法返回一个包含对象所有值的数组...Object.getOwnPropertyNames(obj)); // 输出 ['name', 'age', 'nonEnumerable'] 七、Object.getOwnPropertyDescriptors()方法 这个方法返回一个描述对象的所有自有属性的对象...(包含name, age, nonEnumerable的描述符) 以上就是一些在JavaScript中获取对象属性的主要方式。根据你的需求和场景,选择合适的方法来访问和操作对象的属性。

    7110

    Linux不同共享库中同名函数的处理

    场景引入: 在一个尚未成熟的行业中,一般行业标准是先于国家标准。这就导致了开发人员需要做很多兼容工作,再就是会用到很多其他厂商提供的库与头文件,面对不同版本的标准,一般会更新库与头文件。...那么此时如果要兼容新库和旧库要做怎样的操作呢? ①当两个C语言共享库之间有同名函数,链接时会报错么? ②如果不报错,调用的顺序是如何确定的呢? ③如果我想兼容两个库,该如何操作呢?...(别人的库无法更改函数名、C++可以使用命名空间) 方法是肯定有的,这次先测试①和②效果。 一、创建两个具有同名函数的共享库 1. 文件目录结构 ?...两个共享库中有同名函数myPrintf(),输出内容不同。 二、测试共享库 1. 目录结构 ? myAppTest是程序执行环境 env.sh内容:export LD_LIBRARY_PATH=....一、小结 当两个共享库中有同名函数时,调用函数顺序取决于链接库顺序。

    3K10

    JSON对象和JavaScript对象直接量的区别--不同之处

    JSON对象和JS对象直接量 在工作当中,我们总是可以听到人说将数据转换为JSON对象,或者说把JSON对象转换为字符串之类的话,下面是关于JSON的具体说明。  ...JSON对象并不是JavaScript对象字面量(Object Literals) 很多人错误的将JSON认为是JavaScript当中的对象字面量(object Literals),原因非常简单,就是因为它们的语法是非常相似的...(Literals) 字符串字面量是由双引号(")或单引号(')包围起来的零个或多个字符组成的。(Strings Literals) 对象字面量是由大括号({})括起来的零个或多个对象的属性名-值对。...JS当中的JSON对象 目前,JSON对象已经成为了JS当中的一个内置对象,有两个静态的方法:JSON.parse和JSON.stringify。...JSON.parse主要要来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。

    1.8K30

    Python中使用deepdiff对比json对象时,对比时如何忽略数组中多个不同对象的相同字段

    一般是用deepdiff进行对比的时候,常见的对比是对比单个的json对象,这个时候如果某个字段的结果有差异时,可以使用exclude_paths选项去指定要忽略的字段内容,可以看下面的案例进行学习:...上面的代码是一般单条数据对比的情况。...那么如果数据量比较大的话,单条对比查询数据效率比较低,因此,肯呢个会调用接口进行批量查询,然后将数据转成[{},{},{}]的列表形式去进行对比,那么这个时候再使用exclude_paths就无法直接简单的排除某个字段了...从上图可以看出,此时对比列表元素的话,除非自己一个个去指定要排除哪个索引下的字段,不过这样当列表的数据比较多的时候,这样写起来就很不方便,代码可读性也很差,之前找到过一个用法,后来好久没用,有点忘了,今晚又去翻以前写过的代码记录...这里对比还遇到一个问题,等回头解决了再分享: 就这种值一样,类型不一样的,要想办法排除掉。要是小伙伴有好的方法,欢迎指导指导我。

    91620

    kettle基础使用(两个表字段不同的数据迁移)

    前言 在业务中,我们会遇到新老平台的数据迁移工作,如果这个时候表字段还有些许的不一样,那我们肯定不能用表数据导入导出功能了,此时,我们便会需要另一个工具,kettle。...这款软件 使用 我们新建一个转换 (这里因为我之前用过了,所以界面上有点东西) 输入配置 在输入中双击表输入 右键选择编辑步骤 按照图中所示输入你要作为数据源的数据库信息 输入能查出你要转移数据的...sql并且测试是否可以获取到数据 此时我们的数据源就配置好了 输出配置 双击输出里的 插入/更新 此时这两个图形中间会有条线(自动关联上了),如果没有我们只需要按住键盘shift键,然后鼠标点击输入拖动到...在 用于查询的关键字 里将两张表的id作为关联 点击下面的编辑配置两张表字段之间的关联关系(注意,上面的数据库连接要是你刚刚新建的那个数据库连接信息) kettle,启动 此时,我们便可以点击右上角的启动按钮了...让我们继续加油,一起学习,变成更好的我们

    31910

    细说Python中的函数不同使用方法

    跟大多数程序语言一样,Python也有函数的使用,但是有一点得注意,在Python中,你定义的函数必须写在最前面,不然当计算机识别到你想要调用的函数,它会报错,它会理解为这个语句并没有定义过...因为Python是一种解释型语言,它会从上往下依次运行,所以 目录 1、先看一段 简单的代码 2、接下里就是两个函数之间的调用 3、用函数传递参数 函数传递参数的变式 4、 传递多个参数 5、返回值 6...、局部变量与全局变量 7、函数中使用全局变量的值 8、内建函数 9、一个函数也可以返回多个函数值 10、接下来该考虑一下比较综合性的函数 1、先看一段 简单的代码 def hello(): #定义函数用...所以程序第一行打印的是33,此后调用 函数sss,此时更行第四行中全局变量的值,再打印x的值时,为800 8、内建函数 内建函数要用到 “exec ”函数,最终的结果时再一个程序中运行另一个程序,听起来挺拗口的...,但是有的时候却要传入多组数据,我们可以使用任意参数长度标记——星号(*),我们就可以编写接收不同参数数量的函数,下面是一个实例 def average(*numbers): # * 的作用是将数据变成一个元组存放

    1.2K20

    常见的触发函数的事件(实现不同的用户体验)

    写js的时候都知道,函数是我们基本上面每天都在写的一个东西,因为很多的功能是需要函数来实现的,没有函数很多的效果是没办法实现的,那么今天简单的总结一下可以触发函数的一些事件。...onmousewheel //滚轮滚动的时候触发 应用场景:需要滚轮操作的时候 效果实现:将鼠标移动到该元素的区域,这个时候滚动您的鼠标的滚轮,就会触发函数。...答案是可以的,这个函数监听的是键盘的是操作,不管是不是被锁定,也就是说这个监听的是包含系统按键的。...这里需要说明一下,如果您调的输入法是中文的,那么您输入中文的时候是不会触发的,即使完成了一次按压,还有就是回车键和空格键是属于系统按键,但是是可以触发这个函数的。...是可以的,但是滑动的过程总是要停止的,也就是说如果一直滑动没有停止的话,这个函数是不触发的,但是onseeking是知道滑动就会触发,不管是不是停止。

    92120
    领券