3

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

                }
            } 

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

4

5 回答 5

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

        }
于 2013-02-27T10:53:46.230 回答
2

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

就像是:

var unique = list.GroupBy(i => i.ID).Select(x => x.OrderByDescending(y => y.LastModifiedDate).First());
于 2013-02-27T10:42:05.680 回答
1

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

于 2013-02-27T10:33:07.470 回答
0

为此,您必须创建自己的 EquityComparer,然后您可以使用 linq 的 Distinct 方法。Enumerable.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);
    }
于 2013-02-27T10:33:37.347 回答
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();
于 2013-02-27T11:50:43.377 回答