C# 从数组中删除具有匹配项的重复项
我有以下数组:C# 从数组中删除具有匹配项的重复项,c#,C#,我有以下数组: new string[] { "A", "B", "C", "D", "A" } 我想做的是删除重复的值和重复的值。我期望这一结果: new string[] { "B", "C", "D" } 我正在尝试这样做: names.Distinct().ToArray(); 但这只会删除重复的值,并将原始值保留在数组中 如何解决此问题?无法更改数组的大小。但是,您可以将数组重新分配给变量 names = names.Distinct().ToArray() 更新:Doh误读了
new string[] { "A", "B", "C", "D", "A" }
我想做的是删除重复的值和重复的值。我期望这一结果:
new string[] { "B", "C", "D" }
我正在尝试这样做:
names.Distinct().ToArray();
但这只会删除重复的值,并将原始值保留在数组中
如何解决此问题?无法更改数组的大小。但是,您可以将数组重新分配给变量
names = names.Distinct().ToArray()
更新:Doh误读了我手机上的问题
您是否希望更改数组,因为上面关于更新变量的答案仍然适用
获取只出现一次的项目
names.GroupBy(x => x).Where(x => !Skip(1).Any()).Select(x => x.Key).ToArray();
如果要删除所有重复项,可以按值分组并选择计数为1的所有项 例如:
var tmp = new string[] { "A", "B", "C", "D", "A" };
var unique = tmp.GroupBy(s => s) // Group all items into a collection
.Where(s => s.Count() == 1) // Only select items that occur a single time
.Select(s => s.Key); // Select the original value back out (stored as the Key).
foreach(var item in unique) {
Console.WriteLine(item);
}
OP正在尝试删除所有出现的重复项,包括原始项。这很好,但我要补充的是,如果我们处于重复项数量较大的场景中,则存在潜在的优化。(也就是说,我们有一千个“a”而不是两个)而不是
。Where(s=>s.Count()==1)
你可以说。Where(s=>s.Take(2.Count()==1)
这意味着“开始计算项目,如果你得到两个,就丢弃它”。相比之下,前者的意思是“开始清点物品,清点完毕后,丢弃不属于一个的物品”。如果你想知道一个罐子里是否有两个或两个以上的便士,你不必数一数所有的便士<代码>!s、 跳过(1)。例如Any()也会做同样的事情,但我发现读起来有点困难。@EricLippert感谢您的输入。实际上,我没有考虑到这对性能的影响。在当前实现“Enumerable.GroupBy”的情况下,“Enumerable.Count”可能是最快的方法。分组被缓存并实现“ICollection.Count”。