删除多次出现的数组元素

Array.Distinct()留下不同的元素。 如何从Array中删除所有重复元素, 包括原始元素?

例如,给定此输入数组:

 { Dog, Cat, Mouse, Dog, Dog, Parrot, Mouse, Hound } 

我想得到这个输出:

 { Cat, Parrot, Hound } 

你可以使用一点Linq:

 var singles = myArray .GroupBy(x => x) .Where(g => g.Count() == 1) .SelectMany(g => g); 

或者像这样:

 var singles = myArray .GroupBy(x => x) .Where(g => !g.Skip(1).Any()) .SelectMany(g => g); 
  • GroupBy方法将所有类似元素收集在一起。
  • Where方法将过滤掉不符合特定条件的组。 我提供了两个替代条件,但它们都做同样的事情 – 只有当组包含一个元素时它们才返回true
    • g.Count() == 1计算每个组中元素的数量,如果结果等于1则返回true
    • !g.Skip(1).Any()如果第一个之后没有元素,则!g.Skip(1).Any()返回true 。 这实际上比g.Count() == 1更有效,因为它不需要枚举组中的所有元素,但它对某些读者来说有点混乱,所以在生产代码中引入它之前要三思而后行。
  • 最后, SelectMany将返回结果集合中的所有元素。 由于每个组中只有一个元素,因此只剩下那些不重复的元素。

你可以尝试这样的事情:

 Array.GroupBy(x => x).Where(x => x.Count() == 1).SelectMany(x => x); 
 myList.Where(i => myList.Count(j => j == i) < 2); 

请注意,这依赖于==运算符是一个足够好的比较(尽管你可以用你想要的任何比较替换它)。 它也不是很有效,但我怀疑其他任何答案都是。

这可以通过将结果限制为在源列表中不会出现多次的元素来实现。

使用Group by子句可以获得结果。

 var list = new List { "Dog", "Cat", "Mouse", "Dog", "Dog", "Parrot", "Mouse", "Hound" }; //var list = new List { "a", "b", "a", "c", "a", "b" }; var q = (from x in list group x by x into g let count = g.Count() where count == 1 orderby count descending select g.Key); foreach (var x in q) { Console.WriteLine(x); } 
 int []s={1,2,2,3,5,4,4}; int[] q = s.Distinct().ToArray(); 

它将返回{1,2,3,5,4}