c# List去重

c# List去重需求:对List集合中的元素去重。实现:有三种方式可以使用-使用Linq中distinct()方法-借助hashset-使用for循环遍历,这种方法在数据量大时,运行速度比较慢代码示例使用distinct()//使用distinct()List<string>lst1=newList<string>(){“as”,”lio”,”sdrf”,”asd”,”lio”};varr.

大家好,又见面了,我是你们的朋友全栈君。

  1. 需求 : 对List集合中的元素去重。
  2. 实现: 有三种方式可以使用
    – 使用Linq中distinct()方法
    – 借助hashset
    – 使用for循环遍历,这种方法在数据量大时,运行速度比较慢

代码示例

  • 使用distinct()

  //使用distinct()
  List<string> lst1 = new List<string>() 
  { 
    "as", "lio", "sdrf", "asd", "lio" };
            var  reslst =lst1.Distinct().ToList();
  • 使用hashset

 public static List<T> RemoveT<T>(List<T> items)
        { 
   
            HashSet<T> set = new HashSet<T>();

            var res = new List<T>();//返回

            for (int i = 0; i < items.Count; i++)
            { 
   
                if (!set.Contains(items[i]))
                { 
   
                    set.Add(items[i]);
                    res.Add(items[i]);
                }
            }
            return res;
        }
  • 使用for-loop

 public  static List<string> ForLoopRemove(List<string> items)
        { 
   
            List<string> output = new List<string>();
            for (int i = 0; i < items.Count; i++)
            { 
   
                bool flag = false;
                //每个元素都与其他这个元素前面的比较,如果前面没有,则添加,否则不添加
                for (int z = 0; z < i; z++)
                { 
   
                    if (items[z] == items[i])
                    { 
   
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                { 
   
                    output.Add(items[i]);
                }
            }
            return output;
        }

测试三种方式的运行速度
代码示例

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApp2
{ 

class Program
{ 

static void Main(string[] args)
{ 

//list 去重,三种方法
for (int test = 0; test < 3; test++)
{ 

// 获取测试数据
var testData = GetTestData(test);
var max = testData.Item3;///执行次数
var s1 = Stopwatch.StartNew();
for (int i = 0; i < max; i++)
{ 

// 方法 1: use Distinct.
var unique = testData.Item2.Distinct().ToList();
}
s1.Stop();
var s2 = Stopwatch.StartNew();
for (int i = 0; i < max; i++)
{ 

// 方法 2: use HashSet.
var unique = Method.RemoveT(testData.Item2);
}
s2.Stop();
var s3 = Stopwatch.StartNew();
for (int i = 0; i < max; i++)
{ 

// 方法 3: use nested for-loop.
var unique = Method.ForLoopRemove(testData.Item2);
}
s3.Stop();
// 打印信息.
Console.WriteLine(testData.Item1);
//调用时间.
Console.WriteLine(s1.Elapsed.TotalMilliseconds + " ms");
Console.WriteLine(s2.Elapsed.TotalMilliseconds + " ms");
Console.WriteLine(s3.Elapsed.TotalMilliseconds + " ms");
}
//结论: 当数据量少时,直接使用for-loop 遍历数据即可;
//当数据量大时,使用hashSet 或者时linq的distinct()方法
List<string> testLst=  GetListWithDuplicates(100, 20);
Method.RemoveRepeat(testLst);
//实现按照对象的某个字段去重。
List<Student> lst = new List<Student>();
lst.Add(new Student { 
 No = 23, name = "李磊" });
lst.Add(new Student { 
 No = 45, name = "david" });
lst.Add(new Student { 
 No = 12, name = "lily" });
lst.Add(new Student { 
 No = 23, name = "李磊" });
lst.Add(new Student { 
 No = 45, name = "david" });
lst.Add(new Student { 
 No = 72, name = "lily" });
var res=  lst.Distinct(new ItemEqualityComparer());
foreach (var item in res)
{ 

Console.WriteLine($"distinct: {item.No}---{item.name}");
}
Console.ReadKey();
}
/// <summary>
/// 生成测试数据,最后的一个参数,表示方法被调用的次数
/// </summary>
/// <param name="test"></param>
/// <returns></returns>
static Tuple<string, List<string>, int> GetTestData(int test)
{ 

// Tuple contains description string, list, the unique element count, and iterations for test.
switch (test)
{ 

default:
case 0:
return new Tuple<string, List<string>, int>("10 ELEMENT LIST, 0 DUPLICATES",
GetListWithDuplicates(10, 0),
100000);
case 1:
return new Tuple<string, List<string>, int>("300 ELEMENT LIST, 100 DUPLICATES",
GetListWithDuplicates(200, 100),
1000);
case 2:
return new Tuple<string, List<string>, int>("3000 ELEMENT LIST, 1000 DUPLICATES",
GetListWithDuplicates(2000, 1000),
100);
}
}
public static List<string> GetListWithDuplicates(int len, int repeatNum)
{ 

const string duplicateString = "bird";
List<string> result = new List<string>();
for (int i = 0; i < len; i++)
{ 

result.Add("cat" + i);
if (repeatNum > 0)
{ 

result.Add(duplicateString);
repeatNum--;
}
}
for (int i = 0; i < repeatNum; i++)
{ 

result.Add(duplicateString);
}
return result;
}
}
/// //
#region 按照对象的某个字段去重
public class Student
{ 

public string name;
public int No;
}
/// <summary>
/// 按照学号判断
/// </summary>
public class ItemEqualityComparer : IEqualityComparer<Student>
{ 

public bool Equals(Student x, Student y)
{ 

return x.No == y.No;
}
public int GetHashCode(Student obj)
{ 

return obj.No.GetHashCode();
}
}
#endregion
}

调用方法的封装

using System;
using System.Collections.Generic;
namespace ConsoleApp2
{ 

public static class Method
{ 

/// <summary>
/// 使用两个循环,但是在数据量大时,这种方法比较慢
/// </summary>
/// <param name="items"></param>
/// <returns></returns>
public  static List<string> ForLoopRemove(List<string> items)
{ 

List<string> output = new List<string>();
for (int i = 0; i < items.Count; i++)
{ 

bool flag = false;
//每个元素都与其他这个元素前面的比较,如果前面没有,则添加,否则不添加
for (int z = 0; z < i; z++)
{ 

if (items[z] == items[i])
{ 

flag = true;
break;
}
}
if (!flag)
{ 

output.Add(items[i]);
}
}
return output;
}
/// <summary>
/// 使用hashset去重
/// </summary>
/// <param name="lst"></param>
public  static void RemoveRepeat(List<string> lst)
{ 

Console.WriteLine("intput :" + lst.Count);
HashSet<string> set = new HashSet<string>();
foreach (string item in lst)
{ 

set.Add(item);
}
Console.WriteLine(set.Count);
lst.Clear();
lst.AddRange(set);
Console.WriteLine("outPut: "+lst.Count);
}
/// <summary>
/// 使用hashset去重的泛型方法
/// </summary>
/// <param name="items"></param>
public static List<T> RemoveT<T>(List<T> items)
{ 

HashSet<T> set = new HashSet<T>();
var res = new List<T>();//返回
for (int i = 0; i < items.Count; i++)
{ 

if (!set.Contains(items[i]))
{ 

set.Add(items[i]);
res.Add(items[i]);
}
}
return res;
}
}
}
  • 代码中,也提供了对象集合按照对象的某个字段进行去重的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141341.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 如何开启MySQL慢查询日志

    如何开启MySQL慢查询日志摘要:前言数据库日志记录了用户对数据库的各种操作及数据库发生的各种事件。能帮助数据库管理员追踪、分析问题。MySQL提供了错误日志、二进制日志、查询日志、慢查询日志。MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值(long_query_time,单位:秒)的SQL语句。前言数据库日志记录了用户对数据库的各种操作及数据库发生的各种事件。能帮助数据…

    2022年10月11日
  • Django(35)Django请求生命周期分析(超详细)

    Django(35)Django请求生命周期分析(超详细)Django请求生命周期分析1.客户端发送请求在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都

  • android开发笔记之异步ThreadPoolExecutor

    android开发笔记之异步ThreadPoolExecutorandroid异步开发android异步开发,主要有1.Thread+Handler进行异步处理2.继承Thread类和实现Runnable接口3.AsyncTask类4.RxJava5.AsyncQueryHandler但是事实上AsyncTask是有缺点的。syncTaskisdesignedtobeahelperclassaroundThreadandH…

  • 简易网页音乐播放器

    简易网页音乐播放器简易网页音乐播放器开发工具与关键技术:DW2021jQueryHTML5撰写时间:2021年5月28日简介与要点:在网页上制作一个音乐播放器我们仅需用到一个新的标签<audiosrc=”素材音乐”controls></audio>;因为我们这个音乐播放不是单曲循环的使用还要…

  • 【181212】VC++超市进销存管理系统(Access)源代码

    【181212】VC++超市进销存管理系统(Access)源代码源码下载简介一个相当不错的VC++毕业设计作品,一个超市进销存管理系统,不但界面专业,而且功能也丝毫不落后,编译后运行如上图示。这个进销存系统使用Access作为数据库,系统可完成基础资料维护、销售管理、库存管理、帐务管理、数据管理、辅助工具等,并以系统流程图的方式显示示意图,更直观、更有利于对软件的操作。源码下载地址:点击下载备用下载地址:点击下载…

  • ionic css 自定义样式

    ionic css 自定义样式

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号