首页 > 编程语言 >[C#]LINQ中如何按实体的某个属性去重

[C#]LINQ中如何按实体的某个属性去重

时间:2023-07-18 16:36:25浏览次数:40  
标签:Name people C# LINQ var new Id 属性

NET[C#]LINQ中如何按实体的某个属性去重后返回不重复的集合?

问题描述

比如有如下实体集合:

Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

如何使用LINQ按 Person.Id 去重,返回的集合只包含 Person1Person3

方案一

创建一个静态扩展类:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

调用方法:

var query = people.DistinctBy(p => p.Id);

如果需要按多个属性去重,则可以使用匿名对象,如:

var query = people.DistinctBy(p => new { p.Id, p.Name });

方案二

List<Person> distinctPeople = allPeople
  .GroupBy(p => p.PersonId)
  .Select(g => g.First())
  .ToList();

多属性去重:

List<Person> distinctPeople = allPeople
  .GroupBy(p => new {p.PersonId, p.FavoriteColor} )
  .Select(g => g.First())
  .ToList();

方案三

var uniquePeople = from p in people
                   group p by new {p.ID} //or group by new {p.ID, p.Name, p.Whatever}
                   into mygroup
                   select mygroup.FirstOrDefault();

方案四

Persons.ToLookup(p => p.Id).Select(coll => coll.First());

方案五

var result = people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));

标签:Name,people,C#,LINQ,var,new,Id,属性
From: https://www.cnblogs.com/Andy-Blog/p/17563376.html

相关文章

  • c++ 参数引用传递
    1#include<iostream>2#include<thread>3#include<windows.h>4usingnamespacestd;5voidA(int&a){6cout<<"address"<<&a<<endl;;7cout<<"value"<<a......
  • 拦截器(Interceptor)
    拦截器(Interceptor)是一种在应用程序中用于拦截、处理和修改请求和响应的组件或模块。在很多框架和开发平台中都存在拦截器的概念,包括Java的Spring框架、Android的OkHttp库等。拦截器通常用于在请求被处理之前和响应被返回之前执行某些额外的逻辑或功能。它们可以用于日志记录、身......
  • css 超出行显示展开收起
    显示展开收起:<divclass="wrapper"><inputid="exp111"class="exp"type="checkbox"><divclass="text">......
  • Office Tool Plus
    亲测可用,记录一下......
  • MIMO-OFDM-Based Massive Connectivity With Frequency Selectivity Compensation
    SystemModelMIMO-OFDM-BasedGrant-freeNOMAModelTheallocatedbandwidthisusedtosupport\(K\)single-antennadevicestorandomlyaccessan\(M\)-antennabasestation(BS).Ineachtimeinstance,onlyasmallsubsetofdevicesareactive.Tocha......
  • Oracle 主键冲突报错踩坑-- "ORA-00001: 违反唯一约束条件 "
    根本原因因为特殊字符存在导致的主键冲突报错细节分析前提oracle中存在一张table,table中存在字段CName(nvarchar),且该字段为唯一主键;具体现有一条数据需要入库,内容如下'中信建投惠享债券型证券投资基金​'(包含零宽空格符)直接根据这个字段值查询数据库值是不存在的sel......
  • CURL常用参数
    CURLcurl-XPOST-i'http://10.25.5.36/service/api/v1/province/registerSourceQuery'-H"Content-Type:application/json"-d'{"messageHeader":{"accessAccount":"43198521900","sign":"43198......
  • antd+vue3 tree-select 组件库 筛选结果不正确的问题
    第一次遇到这种带搜索框的下拉树状列表搜索关键字的时候出现我不想要的结果。我感觉组件它只是搜索一级列表而没有搜索二级列表,然后一节列表把它整个的二级列表带出来了。二级列表里边包含搜索关键字的所有item才是我想要的。相关代码:1<!--页面名称-->2<div......
  • C# 循环对象,获取对象每个属性的名、值、类型
    varcurData=newStudent();foreach(System.Reflection.PropertyInfopincurData.GetType().GetProperties()){if(p.PropertyType.FullName==typeof(decimal).FullName){ls.Add((decimal)p.GetValue(curDat......
  • 通过docker-compose 快速部署 harbor
    一、概述Harbor是一个开源的企业级DockerRegistry管理工具,它提供了一个安全、可靠、可扩展的平台,用于存储、管理和分发Docker镜像。Harbor可以帮助组织和团队更好地管理Docker镜像,并提高应用程序构建和部署的效率。以下是Harbor的一些主要特点:安全:Harbor提供了完整的认证......