繁体   English   中英

删除出现多次的数组元素

[英]Remove array elements that appear more than once

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()返回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<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);
        }
int []s={1,2,2,3,5,4,4};    

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM