从排序列表中删除重复项c#

本文关键字:删除 排序 列表 | 更新日期: 2023-09-27 18:01:33

我有一个关于大量文件的详细信息列表。该列表包含文件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);
                }
            } 

就是我现在的样式,它仍然允许重复

从排序列表中删除重复项c#

这是因为,您没有搜索整个列表来检查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

我也认为你可以保持你现在的代码,但你必须以这样的方式修改它(作为一个示例):

    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();