我有一个对象列表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;
}
答案 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;
希望这有帮助!