删除多次出现的数组元素

时间:2014-07-09 22:28:37

标签: c# arrays

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

例如,给定此输入数组:

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

我想得到这个输出:

{ Cat, Parrot, Hound }

5 个答案:

答案 0 :(得分:8)

你可以使用一点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()会返回true。这实际上比g.Count() == 1更有效,因为它不需要枚举组中的所有元素,但是对于某些读者来说有点令人困惑,所以在生产代码中引入它之前请三思而后行。
  • 最后,SelectMany将返回结果集合中的所有元素。由于每个组中只有一个元素,因此只剩下那些不重复的元素。

答案 1 :(得分:2)

您可以尝试这样的事情:

Array.GroupBy(x => x).Where(x => x.Count() == 1).SelectMany(x => x);

答案 2 :(得分:1)

myList.Where(i => myList.Count(j => j == i) < 2);

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

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

答案 3 :(得分:1)

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

var list = new List<string>  { "Dog", "Cat", "Mouse", "Dog", "Dog", "Parrot", "Mouse", "Hound" };


        //var list = new List<string> { "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);
        }

答案 4 :(得分:0)

int []s={1,2,2,3,5,4,4};    

int[] q = s.Distinct().ToArray();

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