删除多次出现的数组元素

本文关键字:数组元素 删除 | 更新日期: 2023-09-27 18:12:09

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方法将筛选出不满足特定条件的组。我提供了两种替代条件,但它们都做了相同的事情—仅当组恰好包含一个元素时,它们才返回CCD_ 4:
    • g.Count() == 1对每组中的元素数量进行计数,如果结果等于1,则返回true
    • 如果第一个元素之后没有元素,则CCD_ 7返回CCD_。这实际上比g.Count() == 1稍微高效一些,因为它不需要枚举组中的所有元素,但对一些读者来说有点困惑,所以在将其引入生产代码之前要三思而后行
  • 最后,SelectMany将返回结果集合中的所有元素。由于每组中只有一个元素,因此只剩下那些不重复的元素

你可以试试这样的东西:

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

使用Groupby子句可以得到结果。

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);
        }
myList.Where(i => myList.Count(j => j == i) < 2);

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

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