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

时间:2013-02-27 10:30:30

标签: c# list duplicate-removal

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

                }
            } 

这就是我现在所拥有的,它仍然允许重复

5 个答案:

答案 0 :(得分:3)

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

        }

答案 1 :(得分:2)

我不知道这段代码是否只是简化了,但您是否考虑过对ID进行分组,在LastModifiedDate上进行排序,然后从每个组中取出第一个?

类似的东西:

var unique = list.GroupBy(i => i.ID).Select(x => x.OrderByDescending(y => y.LastModifiedDate).First());

答案 2 :(得分:1)

var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate).Distinct() ??

答案 3 :(得分:0)

为此,您必须创建自己的EquityComparer,之后您可以使用linq的Distinct方法。 Enumerable.Distinct at 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);
    }

答案 4 :(得分:0)

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