?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
在c#~程中经怋用,而经常用list d攑֮体集Q因此会设计到对list的各U操作,比较常见的有对listq行排序Q查找,比较Q去重复。而一般的如果要对list去重复如果用linq distinct方式Q会遇到一些坑爹的问题Q发现结果集中还是存在重复数据,原因是用这U方法是对对象的引用去重复,q不满我们的需求。因此本文通过c#代理的方式实现对list distinct操作?/strong>
先介l一下对list去重复传l的ҎQ代码如下:
List<ReviewersReport> reportList=GetReportList();
for (int i = 0; i < reportList.Count; i++)
{
for (int j = i + 1; j < reportList.Count; j++)
{
if (reportList[i].Equals(reportList[j]))
{
reportList.RemoveAt(reportList.LastIndexOf(reportList[i]));
j--;
}
}
}
通过q种方式对list 实现distinct操作昄比较ȝQ如果还有其他的list实体集也需要实现类似的功能Q那我们׃Z码的可重用性担心了?/p>
下面使用单高效的方式d现list的distinct功能Q也是本文推荐的方式?/strong>
先创Z个Comparec,如下Q?/p>
public delegate bool EqualsComparer<T>(T x, T y);
public class Compare<T> : IEqualityComparer<T>
{
private EqualsComparer<T> _equalsComparer;
public Compare(EqualsComparer<T> equalsComparer)
{
this._equalsComparer = equalsComparer;
}
public bool Equals(T x, T y)
{
if (null != this._equalsComparer)
return this._equalsComparer(x, y);
else
return false;
}
public int GetHashCode(T obj)
{
return obj.ToString().GetHashCode();
}
}
q里在构造器中传递一个delegate,调用者可以在q个delegate定义比较规则Q这样具有了极大的灵zL,我们可以注意到Compare实现了IEqualityComparer接口来自定义比较对象Q判断两个对象是否相{。用方式如下:
ist<ReviewersReport> requestList =Get RequestList ();
requestList =requestList.Distinct(new Compare<Requestor>((x, y) => (null != x && null != y) && (x.RequestorName.Equals(y.RequestorName)))).ToList();
用这U方式大大的扩展了比较器的用范_增加了代码的可重用性,可以适用于Q何对象的比较?/p>
比较后我们可以对赯行排序,使代码也很简z?a href="/" style="margin: 0px; padding: 0px; color: rgb(51, 51, 51); text-decoration: none;">南软g开?/a>