簡體   English   中英

從排序列表中刪除重復項c#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM