还在为删除集合中的相同项而烦恼吗?
2012-09-04 13:49
162 查看
在项目过程中大家都会遇到这样的需求,去除相同数据项目。不知道大家做多这样的需求没有,把csv数据导入到DB中。要求csv中如果某几个列相同,这样的数据就不插入到库中。
第一个闪现在大家脑海中的方法是不是直接写个循环,然后一个个去判断。今天我们来看看另一套方法。利用Distinct方法来进行实现。
我们来看看这个方法,这个方法来之Enumerable这个静态类,里面有这样一个方法
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
这个方法是一个扩展方法。在形参里面有两个参数,大家有没有看到第一个形参中有个this,其实这就是扩展方法。在这里给大家稍微温习下扩展方法,
扩展方法是编译器的一种手段。它需要几个条件
1、在静态类中
2、是一个静态的公共的方法
3、第一个形参前要加上一个this
这样就可以了。你要扩展到哪个类中去,那么第一个参数就是那个类的类型。
我们再来看看第二个参数IEqualityComparer<TSource> comparer是一个IEqualityComparer<TSource>的泛型接口。
我们看看这个泛型接口,这个接口里面只有两个方法
bool Equals(T x, T y);
int GetHashCode(T obj);
我们来看看Equals,从解释中我们知道。如果两个对象是相等的就返回true,如果不相等就返回false。
好的,那我们就来构造集合中的Distinct方法需要的条件。
首先我们来实现我们自己的比较类,然后再来实现这个接口。
我们这个类的需求是这样的。可以自定设定要比较的属性名,可以是多个也可是是单个。
分析就到这里,接下来我们来看看具体的实现方式
请看代码:
View Code
结果如下:
不好意思啊。我这里是日文的操作系统。那几个中文字显示的不到位啊。不过不影响大家看效果啊。
广纳各位的意见。欢迎大家拍砖。
第一个闪现在大家脑海中的方法是不是直接写个循环,然后一个个去判断。今天我们来看看另一套方法。利用Distinct方法来进行实现。
我们来看看这个方法,这个方法来之Enumerable这个静态类,里面有这样一个方法
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
这个方法是一个扩展方法。在形参里面有两个参数,大家有没有看到第一个形参中有个this,其实这就是扩展方法。在这里给大家稍微温习下扩展方法,
扩展方法是编译器的一种手段。它需要几个条件
1、在静态类中
2、是一个静态的公共的方法
3、第一个形参前要加上一个this
这样就可以了。你要扩展到哪个类中去,那么第一个参数就是那个类的类型。
我们再来看看第二个参数IEqualityComparer<TSource> comparer是一个IEqualityComparer<TSource>的泛型接口。
我们看看这个泛型接口,这个接口里面只有两个方法
bool Equals(T x, T y);
int GetHashCode(T obj);
我们来看看Equals,从解释中我们知道。如果两个对象是相等的就返回true,如果不相等就返回false。
好的,那我们就来构造集合中的Distinct方法需要的条件。
首先我们来实现我们自己的比较类,然后再来实现这个接口。
我们这个类的需求是这样的。可以自定设定要比较的属性名,可以是多个也可是是单个。
分析就到这里,接下来我们来看看具体的实现方式
请看代码:
View Code
public class Student { public string StuNo { get; set; } public string StuName { get; set; } public string StuTel { get; set; } public Student(string no,string name,string tel) { this.StuNo = no; this.StuName = name; this.StuTel = tel; } } List<Student> lstStu = new List<Student>(){ new Student("0001","一","137"), new Student("0001","二","138"), new Student("0002","三","137"), new Student("0001","四","138"), new Student("0002","五","137"), new Student("0003","六","137"), new Student("0001","七","137"), new Student("0008","八","136"), new Student("0008","九","137") }; Console.WriteLine("未删除重复前.............."); foreach (Student student in lstStu) { Console.WriteLine("No " + student.StuNo + " Name " + student.StuName + " Tel " + student.StuTel); } DistinctObj<Student> distinct = new DistinctObj<Student>(); distinct.SetCompareProperty(new string[] { "StuNo", "StuTel" }); List<Student> lst = lstStu.Distinct(distinct).ToList(); Console.WriteLine("删除重复后.............."); foreach (Student student in lst) { Console.WriteLine("No " + student.StuNo + " Name " + student.StuName + " Tel " + student.StuTel); } Console.Read();
结果如下:
不好意思啊。我这里是日文的操作系统。那几个中文字显示的不到位啊。不过不影响大家看效果啊。
广纳各位的意见。欢迎大家拍砖。
相关文章推荐
- ArrayList删除集合中某一属性相同的元素方法(推荐)
- ArrayList删除集合中某一属性相同的元素
- List集合中删除属性(一个或者多个属性)相同的对象返回List且根据对象属性进行排序输出
- 如何将二个list集合当中相同的元素进行删除。
- map集合之——删除map集合中值相同的键值对
- Iterator的remove方法可保证从源集合中安全地删除对象(转)
- [python]删除列表中相同的元素
- Ubuntu下删除两个文件夹下相同文件名且相同内容的文件V1.1(分色排版)
- Hibernate中hbm文件Set集合顺序对级联插入和删除的影响问题
- 【慕课笔记】第五章 JAVA中的集合框架(中) 第3节 学生选课——删除Map中的学生
- java.util.ConcurrentModificationException 与集合删除
- 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。
- 删除相同的记录
- Java集合删除元素可能出现的问题
- 设计在单链表中删除值相同的多余结点的算法
- 删除集合中的元素
- 去掉集合里相同数据的对象与求两个对象集合的差集的方法
- CMD下一个命令遍历目录并删除相同文件的代码
- 集合遍历时删除元素异常(ConcurrentModificationException)分析
- List集合如何删除对象