【问题标题】:Remove array elements that appear more than once移除多次出现的数组元素
【发布时间】:2014-07-09 22:28:37
【问题描述】:

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

例如,给定这个输入数组:

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

我想得到这个输出:

{ Cat, Parrot, Hound }

【问题讨论】:

  • 我在 Stackoverflow 和谷歌上找不到这个问题的答案,所以为什么会有这么多反对意见?
  • 你好像有三个答案,所以可能是我,但我不明白你的意思。你想删除狗? (顺便说一句,我没有投反对票。)

标签: c# arrays


【解决方案1】:

你可以使用一点 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 将返回结果集合中的所有元素。由于每个组中只有一个元素,因此您只剩下那些不重复的元素。

【讨论】:

  • 看起来不错,而且解释得很好。会试试这个:)
  • @Selman22 OP 不仅想要不同的元素,还想要在输入数组中不多次出现的元素。
【解决方案2】:

你可以试试这样的:

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

【讨论】:

  • 看起来很简单,可以完成它的工作。谢谢
【解决方案3】:

使用 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】:
    myList.Where(i => myList.Count(j => j == i) < 2);
    

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

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

    【讨论】:

    • 虽然这会起作用,但在较大的列表中需要很长时间,因为它必须遍历每个项目的整个列表。
    • @JimMischel,是的,它绝对有这个问题。按方法分组的效率要高得多,但我没有及时想出一个可行的方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2020-12-03
    • 2010-11-06
    • 2011-04-17
    相关资源
    最近更新 更多