原字典转List<DownloadFile>后,如何合并列表并忽略重复属性?
嘿,我懂你现在的处境——把原来基于字典的合并去重逻辑迁移到List<DownloadFile>上,核心还是要保留「跳过重复项」的行为对吧?其实思路和之前类似,只是判断重复的依据从字典的Key变成了DownloadFile类里的唯一标识属性,下面给你具体的实现方案:
核心实现思路
首先你得明确:DownloadFile类中哪个(或哪些)属性用来标识唯一性?这对应原来字典里的Key角色,比如可能是FileUrl、UniqueId或者FileName这类属性。下面我以假设的UniqueKey属性为例,你可以替换成你实际用的属性名。
方案1:直接修改原有列表(添加新的不重复项)
如果想直接在原有的downloads列表里添加新项,同时跳过重复:
// 筛选出newDownloads中不在downloads里的项 var newUniqueItems = newDownloads .Where(newItem => !downloads.Any(existingItem => existingItem.UniqueKey == newItem.UniqueKey)) .ToList(); // 把筛选后的项添加到原列表 downloads.AddRange(newUniqueItems);
方案2:生成新的合并后列表(不修改原列表)
如果希望保留原列表不变,生成一个全新的合并列表:
var mergedDownloads = downloads.Concat( newDownloads.Where(newItem => !downloads.Any(existingItem => existingItem.UniqueKey == newItem.UniqueKey)) ).ToList();
性能优化(大数据量场景)
如果你的列表数据量较大,上面的Any遍历判断效率会偏低。可以先用HashSet存储已有项的唯一标识,这样判断重复的速度会快很多:
// 先把已有项的唯一标识存入HashSet var existingKeys = new HashSet<string>(downloads.Select(item => item.UniqueKey)); // 筛选新项:HashSet.Add会在元素不存在时返回true,存在时返回false,刚好过滤重复 var newUniqueItems = newDownloads .Where(newItem => existingKeys.Add(newItem.UniqueKey)) .ToList(); downloads.AddRange(newUniqueItems);
特殊场景:多属性联合判断唯一性
如果DownloadFile的唯一性需要多个属性共同确定(比如同时校验FileUrl和FileExtension),只需要修改判断条件即可:
var newUniqueItems = newDownloads .Where(newItem => !downloads.Any(existing => existing.FileUrl == newItem.FileUrl && existing.FileExtension == newItem.FileExtension )) .ToList();
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

