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

时间:2012-03-06 11:22:00

标签: c# linq

我有一个对象列表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;
}

2 个答案:

答案 0 :(得分:1)

foreach循环中的每个项目都是FilteredItem列表,您应该检查此列表大小是否大于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值对列表进行排序,然后使用下一个/上一个项目检查每个项目(在O(n log n)中)来更快地执行此操作。

答案 1 :(得分:1)

您也可以使用LinQ方法链实现此目的。按“NewFileName”(GroupBy)对列表进行分组,只获取那些不是唯一的(Where),并将SelectMany放入IEnumerable中。然后循环IEnumerable并将NewFileNameUnique-property设置为'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;

希望这有帮助!