如何从另一个列表中获取重复对象的列表

本文关键字:列表 对象 获取 另一个 | 更新日期: 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)中)。