范型在c#編程中經(jīng)常使用,而經(jīng)常用list 去存放實體集,因此會設(shè)計到對list的各種操作,比較常見的有對list進行排序,查找,比較,去重復(fù)。而一般的如果要對list去重復(fù)如果使用linq distinct方式,會遇到一些坑爹的問題,發(fā)現(xiàn)結(jié)果集中還是存在重復(fù)數(shù)據(jù),原因是使用這種方法是對對象的引用去重復(fù),并不滿足我們的需求。因此本文通過c#代理的方式實現(xiàn)對list distinct操作。
先介紹一下對list去重復(fù)傳統(tǒng)的方法,代碼如下:
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
--
;
}
}
}
通過這種方式對list 實現(xiàn)distinct操作顯然比較麻煩,如果還有其他的list實體集也需要實現(xiàn)類似的功能,那我們就會為代碼的可重用性擔(dān)心了。
?
下面使用簡單高效的方式去實現(xiàn)list的distinct功能,也是本文推薦的方式了
先創(chuàng)建一個Compare類,如下:
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();
}
}
這里在構(gòu)造器中傳遞一個delegate,調(diào)用者可以在這個delegate定義比較規(guī)則,這樣具有了極大的靈活性,我們可以注意到Compare實現(xiàn)了IEqualityComparer接口來自定義比較對象,判斷兩個對象是否相等。使用方式如下:
ist<ReviewersReport> requestList =
Get RequestList ();
requestList
=requestList.Distinct(
new
Compare<Requestor>((x, y) => (
null
!= x &&
null
!= y) && (x.RequestorName.Equals(y.RequestorName)))).ToList();
用這種方式大大的擴展了比較器的使用范圍,增加了代碼的可重用性,可以適用于任何對象的比較。
比較后我們可以對起進行排序,使代碼也很簡潔。
requestList.Sort(
delegate
(Requestor r1, Requestor r2) {
return
r1.RequestorCSL.CompareTo(r2.RequestorCSL); });
希望對園友們有所幫助。。。
?
?
?
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

