使用 linq 删除列表中的重复项
我有一个类 Items
,其属性(Id、Name、Code、Price)。
Items
列表中填充有重复的项目。
例如:
1 Item1 IT00001 $100
2 Item2 IT00002 $200
3 Item3 IT00003 $150
1 Item1 IT00001 $100
3 Item3 IT00003 $150
如何使用 linq 删除列表中的重复项?
I have a class Items
with properties (Id, Name, Code, Price)
.
The List of Items
is populated with duplicated items.
For ex.:
1 Item1 IT00001 $100
2 Item2 IT00002 $200
3 Item3 IT00003 $150
1 Item1 IT00001 $100
3 Item3 IT00003 $150
How to remove the duplicates in the list using linq?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
要仅匹配某些属性,请创建一个自定义相等比较器,例如:
然后像这样使用它:
To match on only some of the properties, create a custom equality comparer, e.g.:
Then use it like this:
如果有什么东西导致您的 Distinct 查询失败,您可能需要查看 MoreLinq 并使用 DistinctBy 运算符并按 id 选择不同的对象。
If there is something that is throwing off your Distinct query, you might want to look at MoreLinq and use the DistinctBy operator and select distinct objects by id.
这就是我能够使用 Linq 进行分组的方式。希望有帮助。
This is how I was able to group by with Linq. Hope it helps.
通用扩展方法:
使用示例:
An universal extension method:
Example of usage:
您可以使用三个选项来删除列表中的重复项:
Distinct(new DistinctItemComparer())
作为 @Christian Hayter 提到过。使用
GroupBy
,但请注意,在GroupBy
中,您应该按所有列进行分组,因为如果您仅按Id
分组,则不会。不要总是删除重复的项目。例如,考虑以下示例:该分组的结果将是:
这是不正确的,因为它认为
{Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
是重复的。所以正确的查询是:3.重写item类中的
Equal
和GetHashCode
:然后你可以像这样使用它:
You have three option here for removing duplicate item in your List:
Distinct(new DistinctItemComparer())
as @Christian Hayter mentioned.Use
GroupBy
, but please note inGroupBy
you should Group by all of the columns because if you just group byId
it doesn't remove duplicate items always. For example consider the following example:The result for this grouping will be:
Which is incorrect because it considers
{Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
as duplicate. So the correct query would be:3.Override
Equal
andGetHashCode
in item class:Then you can use it like this:
使用
Distinct()
但请记住,它使用默认的相等比较器来比较值,因此如果您想要除此之外的任何内容,您需要实现自己的比较器。请参阅 http://msdn.microsoft.com/en-us/library/bb348436 .aspx 为例。
Use
Distinct()
but keep in mind that it uses the default equality comparer to compare values, so if you want anything beyond that you need to implement your own comparer.Please see http://msdn.microsoft.com/en-us/library/bb348436.aspx for an example.
尝试一下这个扩展方法。希望这能有所帮助。
用法:
Try this extension method out. Hopefully this could help.
Usage:
另一种解决方法,不美观但有效。
我有一个 XML 文件,其中包含一个名为“MEMDES”的元素,具有两个属性“GRADE”和“SPD”来记录 RAM 模块信息。
SPD中有很多重复的项目。
这是我用来删除重复项的代码:
Another workaround, not beautiful but working.
I have an XML file with an element called "MEMDES" with two attributes "GRADE" and "SPD" to record the RAM module information.
There is a lot of duplicate items in SPD.
So here is the code I use to remove the duplicated items:
当您不想编写 IEqualityComparer 时,您可以尝试以下操作。
When you don't want to write IEqualityComparer you can try something like following.