首页 > 解决方案 > 如何使用 Linq 根据一个相等的值和一个不同的值删除重复项?

问题描述

我有一堂课

class Foo{
   string valueOne;
   string valueTwo;
}

我在列表中有多个 Foo 对象。这些对象已经是不同的。但是,如果有另一个具有相等 valueOne 和 valueTwo == null 的对象,我也想删除对象。保证在 valueOne 中始终只有最大一个具有相同值的其他“重复”。可以有一个或多个对象具有相同的 valueOne,但 valueTwo 中的值不同。

例如:

var foo1 = new Foo{
   valueOne = "Equal Value",
   valueTwo = "Some value"
};

var foo2 = new Foo{
   valueOne = "Equal Value",
   valueTwo = "Different value"
};

var foo3 = new Foo{
   valueOne = "Equal Value",
   valueTwo = null
};

var foo4 = new Foo{
   valueOne = "SomeOtherValue",
   valueTwo = "whatever"
};

var foo5 = new Foo{
   valueOne = "I have null value, but should still be in list",
   valueTwo = null
};

在删除具有空值的重复项后,我应该有:

foo1:
valueOne = "Equal Value"
valueTwo = "Different"

foo2:
valueOne = "Equal Value"
valueTwo = "Different value"

foo4:
valueOne = "SomeOther Value"
valueTwo = "whatever" 

foo5
valueOne = "I have null value, but should still be in list"
valueTwo = null

所以基本上: Foo 对象可以保留在 valueTwo == null 的列表中,前提是没有另一个具有相同 valueOne 的对象。

我通过使用嵌套循环遍历列表并存储重复项的索引,然后遍历索引并在列表上使用 RemoveAt(index) 使其工作。然而,这确实是一个又长又丑的代码。有没有办法用 Linq 做到这一点?我是 C# 和 Linq 的新手,但希望这可行!

谢谢你的帮助!

编辑:为了更清楚起见,我已经在列表中调用了 GroupBy,使其与众不同。

编辑2:该死,我的解释不清楚。可以有一个或多个对象具有相同的 valueOne,但 valueTwo 中的值不同。不保证在 valueOne 中始终只有最大一个具有相同值的其他“重复”。

尽管可以保证每个 Foo 对象都有一个不同的 valueOne,但只有一个其他 Foo 对象具有相同的 valueOne,但 valueTwo 为 null。如果这有意义..

标签: c#.netlinq.net-core

解决方案


听起来您可能希望您的 Foo 类实现IEquatable<T>,添加您的自定义比较逻辑,然后您可以根据需要使用 .Distinct 。您可以在此处找到有关它的更多信息

更新: 是一个使用自定义 IEquatable 的实现。如果我在您的边缘案例中遗漏任何内容,您应该能够调整逻辑以满足您的需求。


推荐阅读