[英]Removing duplicates from a sorted list c#
我有一個關於大量文件的詳細信息列表。 此列表包含文件ID,上次修改日期和文件路徑。 問題是文件的副本是舊版本,有時會有不同的文件路徑。 我想只存儲文件的最新版本,無論文件路徑如何。 所以我創建了一個遍歷有序列表的循環,檢查ID是否唯一,如果是,則將其存儲在新的唯一列表中。
var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate);
List<Item> unique = new List<Item>();
string curAssetId = null;
foreach (Item result in ordered)
{
if (!result.ID.Equals(curAssetId))
{
unique.Add(result);
curAssetId = result.ID;
}
}
然而,這仍然允許重復進入數據庫,我無法弄清楚為什么這個代碼沒有按預期工作。 重復我的意思是,文件具有相同的ID但不同的文件路徑,就像我之前說的那樣不應該是一個問題。 我只是想要最新版本而不管路徑。 任何人都可以看到問題是什么? 謝謝
var ordered = listOfItems.OrderBy(x => x.AssetID).ThenByDescending(x => x.LastModifiedDate);
List<Item> uniqueItems = new List<Item>();
foreach (Item result in ordered)
{
if (!uniqueItems.Any(x => x.AssetID.Equals(result.AssetID)))
{
uniqueItems.Add(result);
}
}
這就是我現在所擁有的,它仍然允許重復
這是因為,您沒有搜索整個列表來檢查ID是否唯一
List<Item> unique = new List<Item>();
string curAssetId = null; // here is the problem
foreach (Item result in ordered)
{
if (!result.ID.Equals(curAssetId)) // here you only compare the last value.
{
unique.Add(result);
curAssetId = result.ID; // You are only assign the current ID value and
}
}
要解決這個問題,請更改以下內容
if (!result.ID.Equals(curAssetId)) // here you only compare the last value.
{
unique.Add(result);
curAssetId = result.ID; // You are only assign the current ID value and
}
至
if (!unique.Any(x=>x.ID.Equals(result.ID)))
{
unique.Add(result);
}
我不知道這個代碼是否只是簡化了,但您是否考慮過對ID進行分組,對LastModifiedDate進行排序,然后從每個組中取出第一個?
就像是:
var unique = list.GroupBy(i => i.ID).Select(x => x.OrderByDescending(y => y.LastModifiedDate).First());
var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate).Distinct()
??
為此,您必須創建自己的EquityComparer,之后您可以使用linq的Distinct方法。 在msdn上的Enumerable.Distinct
另外我認為你可以使用當前的代碼,但你必須以這種方式修改它(作為樣本):
var ordered = list.OrderByDescending(x => x.LastModifiedDate);
var unique = new List<Item>();
foreach (Item result in ordered)
{
if (unique.Any(x => x.ID == result.ID))
continue;
unique.Add(result);
}
List<Item> p = new List<Item>();
var x = p.Select(c => new Item
{
AssetID = c.AssetID,
LastModifiedDate = c.LastModifiedDate.Date
}).OrderBy(y => y.id).ThenByDescending(c => c.LastModifiedDate).Distinct();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.