使用lambda删除重复项,使最后一项(从副本中)保持活动
本文关键字:副本 一项 活动 lambda 删除 使用 最后 | 更新日期: 2023-09-27 18:12:08
我试图重构一个旧的代码"for-bubled",我不得不删除重复的集合内的项目,如果属性X Y和Z匹配从以前插入的项目,只有最后一个项目要插入应该保留在集合中:
private void RemoveDuplicates()
{
//Remove duplicated items.
int endloop = Items.Count;
for (int i = 0; i < endloop - 1; i++)
{
var item = Items[i];
for (int j = i + 1; j < endloop; j++)
{
if (!item.HasSamePropertiesThan(Items[j]))
{
continue;
}
AllItems.Remove(item);
break;
}
}
}
其中HasSameProperties()是Item的扩展方法,其功能类似于:
public static bool HasSamePropertiesThan(this Item i1, Item i2)
{
return string.Equals(i1.X, i2.X, StringComparison.InvariantCulture)
&& string.Equals(i1.Y, i2.Y, StringComparison.InvariantCulture)
string.Equals(i1.Z, i2.Z, StringComparison.InvariantCulture);
}
所以如果我有一个集合,比如:
[0]A
[1]A
[2]A
[3]B
[4]A
[5]A
我希望能够删除所有的副本,只留下[3]B
和[5]A
存活。
var query = items.GroupBy(i => new {i.X, i.Y, i.Z}).Select(i => i.Last()); // Retrieves entities to not delete
var dupes = Items.Except(query);
dupes.ToList().ForEach(d => Items.Remove(d));
基于这些例子:
使用linq
删除列表中的重复项使用Lambda删除重复项
这似乎不太好工作…(删除的项目是不正确的,有些项目留在集合,应该被删除)我做错了什么?
嗯,一个简短的问题?"查询"的结果,它应该有你正在寻找的结果?在我的opinión中,您将获得ítems的列表,然后您使用之前创建的元素进行查询,最后从原始列表中删除结果
如果我错了,请纠正我,但不像这样做:
items = items.GroupBy(i => new {i.X, i.Y, i.Z}).Select(i => i.Last()).ToList();
如果"Query"的结果没有返回正确的元素,那么你的问题是你如何做查询,或者可能你需要在应用查询
您可以使用HashSet,或者使用linq做如下操作:
var dups = new string[]{"A","A","B","B"};
var nonDupe = dups.Distinct().ToArray();