FCL应用技巧之------使用ListT的Distinct()去除重复元素

2024-01-14 00:18

本文主要是介绍FCL应用技巧之------使用ListT的Distinct()去除重复元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 基本分析

先来看看泛型链表 List<T> 的定义:

public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable

可见它实现了 IEnumerable<T>,而IEnumerable<T>规定了Distinct方法。

 

使用这个方法时要注意:

(1)该方法并不会改变原来的链表;

(2)该方法返回一个对象(假设叫做dis),通过该对象可以枚举原链表中的非重复元素,但是并没有把非重复元素复制一份到新的对象中(连签拷贝也没有)

(3)由于(2),在枚举dis时,始终是依赖于原有链表,所以如果在获得dis后,又更新了原有链表,那么使用dis枚举将会使用原有链表的最新状态。

 

2 测试代码

using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication2
{
class IntroToLINQ
{
static void Main()
{
List<A> list = new List<A>();
A a = new A(100);
list.Add(a);
list.Add(a);
list.Add(a);
IEnumerable<A> distinct = list.Distinct();
//对distinct进行第一次枚举
Console.WriteLine("第一次枚举");
foreach (A aa in distinct)
{
Console.WriteLine(aa.X);
}
//改变原有链表
list.Add(new A(200));
//在此对distinct进行枚举
Console.WriteLine("第二次枚举");
foreach (A aa in distinct)
{
Console.WriteLine(aa.X);
}
}
}
class A
{
private int x;
public A(int x)
{
this.x = x;
}
public int X { get { return x; } }
}
}


输出结果:

第一次枚举
100
第二次枚举
100
200
Press any key to continue . . .

3 总结

 List<T>的Distinct()方法返回的是一个看待原有链表的视角,类似于Sql语句,其本身并没有存放任何元素,其枚举始终依赖于原有链表。如果要得到一个原有链表的真正非重复元素集合,可以参考如下代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication2
{
class IntroToLINQ
{
static void Main()
{
List<A> list = new List<A>();
A a = new A(100);
list.Add(a);
list.Add(a);
list.Add(a);
IEnumerable<A> distinct = list.Distinct();
//获得list的非重复元素组成的新链表list2
List<A> list2 = new List<A>();
foreach (A aa in distinct)
{
list2.Add(aa);
}
list = list2;  //如果原有链表不要了,可以重新赋值
}
}
class A
{
private int x;
public A(int x)
{
this.x = x;
}
public int X { get { return x; } }
}
}


 

 

这篇关于FCL应用技巧之------使用ListT的Distinct()去除重复元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603283

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream