您的位置:首页 > 其它

还在为删除集合中的相同项而烦恼吗?

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

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();


结果如下:



不好意思啊。我这里是日文的操作系统。那几个中文字显示的不到位啊。不过不影响大家看效果啊。

广纳各位的意见。欢迎大家拍砖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: