Remove Item have same key in List C#
我有一个Listn Objects。在n个对象中,有些对象具有相同的Id。示例List = {t1, t2, t3, t4, t5....,t10}.
假设:
t1.Id = t5.id
所以我想把t5从List中去掉。
谁能帮我呢。
在这个问题中:使用LINQ删除列表中的对象,您知道对象重复(例如:"bob"),但在我的问题中,在这个列表中,我以前不知道任何对象重复。
- 你有没有试图解决你的问题?先展示你的努力……
- 你可能想看看System.Collections.Generic.Dictionary课程,除非你的家庭作业/作业绝对要求你使用List代替。
- 我是Linq的新成员。我尝试了2 for循环,但这个解决方案没有优化。
- 如果你需要一个最佳的解决方案:这种问题最好用Dictionary来解决(如上所述)。Dictionary不允许您使用同一个密钥添加多个数据,而且查找密钥的速度非常快。
仅使用Linq to对象:
1
| source = source.GroupBy(t => t.id).Select(g => g.First()).ToList(); |
- 比我高1。同样正确,如果您没有足够的懒惰来使用现有的实现)
- @Lazyberezovsky我认为仅仅为一个DistinctBy调用加载整个moreLinq汇编可能是一种过度杀伤力。这就是为什么我把linq发布到objects-only-answer的原因。
- 真的。你说的对,没有明显的(谓词)。当然应该有。我认为这是因为我自己创造了一个数字。
您可以使用morelinq(从nuget获取)扩展名DistinctBy。
1
| var result = list.DistinctBy(x => x.Id).ToList(); |
- 投反对票的原因是什么?
- 我没有投反对票,但是没有理由让Distinct选择第一个,因为它是使用哈希集或类似的方法实现的。因为他特别要求删除t5,所以你必须保证。不管怎样,那是我最初的反应。不知道这就是你被否决的原因。
- 事实上,这对DistinctBy来说是不正确的。也许那不是当时投票否决的原因。
- @Lassev.Karlsen区,称为If a key is seen multiple times, only the first element with that key is returned.。
- @卡尔森,你可以看看DistinctBy的实现,你会发现它将返回第一个实现。
- 是的,我去看了来源,你说得对。
试试这个:
1
| list.RemoveAll(input => list.Count(i => i.Id == input.Id) > 1); |
1
| var res = items.GroupBy(item => item.Id).Select(item2 => item2.First()).ToList(); |