如何使用LINQ在数组中删除重复元素?如果元素重复,则删除该元素?

3
int [] n=new int[10]{2,3,33,33,55,55,123,33,88,234};
output=2,3,123,88,234;

使用LINQ 我可以通过不断检查来使用两个for循环来完成它。但是我需要一种更简单的方式使用LINQ

它不会删除重复项.. 通过distinct删除重复项将给出 = 2,3,123,33,55,88,234 我的输出应该是 = 2,3,123,,88,234;


Distinct() 怎么样? - Rangesh
1
最好一开始就加上你想要的例子... - Mitch Wheat
请确保问题清楚明确,这不仅仅是去重的问题。 - Lijo
我已经添加了我想要的输出...它与去除重复项给出的答案不同。 - Lijo
好的,非常感谢。 - Lijo
显示剩余2条评论
2个回答

6

我结合了你的分组想法和matiash的计数,不确定它的速度如何。

var result = n.GroupBy(s => s).Where(g => g.Count() == 1).Select(g => g.Key);

更新:我已经测量了速度,看起来时间是线性的,因此您可以将其用于大型集合


恭喜,先生!这样更好 :) - matiash
GroupBy 应该具有 O(n) 的复杂度(参见这个问题,它是关于 SQL Group By 操作的,但原理相同)。筛选和选择也将是 O(n)。注:在测试答案性能(以及 Linq 查询)时,请确保最后调用 ToArray() 或 ToList()。大多数 Linq 方法在内部使用 yield,因此真正的计算可以被推迟,直到对结果进行枚举。调用 ToArray() 确保进行了这种枚举,并且您测量了完整的运行时间。 - qbik
使用LINQ获取字符串中出现最多的单词? - Lijo
@Lijo,你应该为这个问题创建一个新的提问。评论不是一个合适的地方。 - Dmitrii Dovgopolyi

4
var result = n.Where(d => n.Count(d1 => d1 == d) <= 1);

这里的意思是:只选择在n中最多出现1次的元素。
虽然这是二次的,但对于短集合来说并不重要,但可能可以改进。 编辑 Dmitry的解决方案 是线性的,因此更好。

1
请确保您注意到其中的“它是二次的”部分。 - Mitch Wheat
你能解释一下吗?我没看懂你的注释。 - Lijo
它正在工作,这就是我所需要的。哦,我想如果我们将其用于大型集合,它会变慢,这就是你的意思。 - Lijo
@404 表示所需时间将随项目数量的平方增加。特别是对于输入量增加一倍的情况,所需时间将增加四倍。因此,对于大型集合来说,它可能会变得难以处理。 - matiash
我尝试着写了一个稍微更快一些的解决方案(虽然不是完全纯的LINQ)。 - Vaughan Hilts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接