Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数组中删除具有匹配项的重复项_C# - Fatal编程技术网

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”。