如何从另一个列表中获取重复对象的列表
本文关键字:列表 对象 获取 另一个 | 更新日期: 2023-09-27 18:26:46
我有一个对象FilteredItems
的列表。每个项目都有一个属性NewFileName
。我现在想要一个新的列表,这样我就可以对NewFileName
不是唯一的每个对象进行操作。(我想更改这些对象的另一个属性)
我开始写一个Linq查询,我可以根据它们的NewFileName
对它们进行分组,但我不确定现在如何继续。我现在如何筛选组计数>1的组?
或者我走错了路,有一个完全不同的解决方案来获得没有唯一NewFileName
的对象?
var result = from files in FilteredItems
group files by files.newFileName;
foreach (var item in result) {
item.NewFileNameUnique = false;
}
您也可以通过LinQ方法链来实现这一点。按"NewFileName"(GroupBy)对列表进行分组,只获取那些不唯一的(Where),并使用SelectMany将它们放入IEnumerable中。然后循环IEnumerable并将NewFileNameUnique属性设置为"false";
var duplicates = FilteredItems.GroupBy(i => i.NewFileName)
.Where(g => g.Count() > 1)
.SelectMany(r => r.ToList());
foreach(var item in duplicates)
item.NewFileNameUnique = false;
希望这能有所帮助!
foreach循环中的每个项目都是FilteredItem的列表,您应该检查此列表大小是否大于1,如果大于1,则更改此列表中的所有值:
var result = from files in FilteredItems
group files by files.newFileName;
foreach (var item in result) {
if (item.Count() > 1)
{
foreach(var fileDetail in item)
fileDetail.NewFileNameUnique = false;
}
}
最后,您可以通过以下更改值设置您的列表:
FilteredItems = result.SelectMany(x=>x).ToList();
编辑:我认为应该在这里添加一些内容,这就是linq对搜索查询很好,但对更新不好的内容,例如,您可以简单地用两个for循环来处理您的问题:
for(int i=0;i<FilteredItems.Count - 1;i++)
for (int j=i+1;j<FilteredItems.Count;j++)
{
if (FilteredItems[i].newFileName == FilteredItems[j].newFileName)
{
FilteredItems[i].NewFileNameUnique = FilteredItems[j].NewFileNameUnique = false;
}
}
这更具可读性。此外,您可以更快地完成这项工作,方法是先按列表的newFileName值排序,然后用下一个/prev项检查每个项(在O(n log n)中)。