使用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存活。

到目前为止,我已经设法制作了这些lambdas:
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删除重复项

这似乎不太好工作…(删除的项目是不正确的,有些项目留在集合,应该被删除)我做错了什么?

使用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();