Linq利用Distinct去除重復(fù)項(xiàng)問(wèn)題(可自己指定)
Linq利用Distinct去除重復(fù)項(xiàng)
添加一個(gè)擴(kuò)展方法
public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { ? ? HashSet<TKey> seenKeys = new HashSet<TKey>(); ? ? foreach (TSource element in source) ? ? { ? ? ? ? if (seenKeys.Add(keySelector(element))) ? ? ? ? { ? ? ? ? ? ? yield return element; ? ? ? ? } ? ? } }
使用方法如下(針對(duì)ID,和Name進(jìn)行Distinct)
var query = people.DistinctBy(p => new { p.Id, p.Name });
若僅僅針對(duì)ID進(jìn)行distinct:
var query = people.DistinctBy(p => p.Id);
Linq利用Except去除重復(fù)數(shù)據(jù)并返回唯一數(shù)據(jù)(IEqualityComparer擴(kuò)展)
前段時(shí)間做一個(gè)項(xiàng)目就是定時(shí)下載節(jié)目列表進(jìn)行對(duì)文件時(shí)間和名字進(jìn)行新舊對(duì)比進(jìn)行去重復(fù),眾所周知,我們?cè)贚inq中去重復(fù)數(shù)據(jù)都用Distinct()做。
但如果想多個(gè)條件進(jìn)行對(duì)比去除重復(fù)數(shù)據(jù),我們應(yīng)該怎么辦呢?
請(qǐng)看下文,利用Except (通過(guò)使用默認(rèn)的相等比較器對(duì)值進(jìn)行比較,生成兩個(gè)序列的差集。)
// // 摘要: // 通過(guò)使用默認(rèn)的相等比較器對(duì)值進(jìn)行比較,生成兩個(gè)序列的差集。 // // 參數(shù): // first: // System.Collections.Generic.IEnumerable`1 也不是在其元素 second 將返回。 // // second: // System.Collections.Generic.IEnumerable`1 同時(shí)出現(xiàn)在第一個(gè)序列的元素將導(dǎo)致從返回的序列中移除這些元素。 // // 類型參數(shù): // TSource: // 輸入序列中的元素的類型。 // // 返回結(jié)果: // 包含這兩個(gè)序列的元素的差集的序列。 // // 異常: // T:System.ArgumentNullException: // first 或 second 為 null。 public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);
示例:
public class ChannelTvListInfo { public string TVName { get; set; } //節(jié)目列表名字 public string LastWriteTime { get; set; }//最后編輯文件時(shí)間 }
private List<ChannelTvListInfo> lstNewTvInfo, lstOldTvInfo = new List<ChannelTvListInfo>(); private void button3_Click(object sender, EventArgs e) { //通過(guò)下載后與定時(shí)下載的目錄文件進(jìn)行名字及最后編輯文件的時(shí)間進(jìn)行對(duì)比更新 lstNewTvInfo = listFTPFiles("60.208.140.xxx", "", ""); DirectoryInfo TheFolder = new DirectoryInfo(@"D:\ChannelTvXML\"); foreach (FileInfo NextFile in TheFolder.GetFileSystemInfos()) { lstOldTvInfo.Add(new ChannelTvListInfo { TVName = NextFile.Name, LastWriteTime = NextFile.LastWriteTime.ToString("yyyy/MM/dd hh:mm tt") }); } } public List<ChannelTvListInfo> listFTPFiles(string FTPAddress, string username, string password) { List<ChannelTvListInfo> listinfo = new List<ChannelTvListInfo>(); using (FtpConnection ftp = new FtpConnection(FTPAddress, username, password)) { ftp.Open(); ftp.Login(); foreach (var file in ftp.GetFiles("/")) { listinfo.Add(new ChannelTvListInfo { TVName = file.Name, LastWriteTime = Convert.ToDateTime(file.LastWriteTime).ToString("yyyy/MM/dd hh:mm tt") }); } ftp.Dispose(); ftp.Close(); } return listinfo; }
效果圖
1:自動(dòng)從FTP目錄下載下來(lái)的xml 節(jié)目列表:
2:從上一個(gè)時(shí)間段自動(dòng)下來(lái)的存放的目錄獲取文件列表
或者新舊List列表中的 差異節(jié)目列表方法:
var result = lstNewTvInfo.Except(lstOldTvInfo.Where(x=>x.TVName.Contains("四川")), new ProductComparer()).ToList();
以下示例顯示如何實(shí)現(xiàn)可在Distinct <TSource>方法中使用的等式比較器。
public class ProductComparer : IEqualityComparer<ChannelTvListInfo> { // Products are equal if their names and product numbers are equal. public bool Equals(ChannelTvListInfo x, ChannelTvListInfo y) { //Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; //Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; //Check whether the products' properties are equal. return x.TVName == y.TVName && x.LastWriteTime == y.LastWriteTime; } // If Equals() returns true for a pair of objects // then GetHashCode() must return the same value for these objects. public int GetHashCode(ChannelTvListInfo product) { //Check whether the object is null if (Object.ReferenceEquals(product, null)) return 0; //Get hash code for the Name field if it is not null. int hashProductName = product.TVName == null ? 0 : product.TVName.GetHashCode(); //Get hash code for the Code field. int hashProductCode = product.LastWriteTime.GetHashCode(); //Calculate the hash code for the product. return hashProductName ^ hashProductCode; } }
最終返回結(jié)果就是有差異的
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Unity實(shí)現(xiàn)菜品識(shí)別的示例代碼
這篇文章主要介紹了如何通過(guò)Unity實(shí)現(xiàn)菜品識(shí)別,可以準(zhǔn)確識(shí)別圖片中的菜品名稱、位置、卡路里信息,并獲取百科信息。感興趣的小伙伴可以了解一下2022-02-02C# 如何設(shè)置label(標(biāo)簽)控件的背景顏色為透明
這篇文章主要介紹了C# 如何設(shè)置label(標(biāo)簽)控件的背景顏色為透明,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-10-10c# 成員類型訪問(wèn)權(quán)限低于字段本身的實(shí)現(xiàn)
本文主要介紹了c# 成員類型訪問(wèn)權(quán)限低于字段本身的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02