C# 删除多次出现的数组元素

C# 删除多次出现的数组元素,c#,arrays,C#,Arrays,Array.Distinct()保留不同的元素。如何从数组中删除所有重复元素(包括原始元素) 例如,给定此输入数组: { Dog, Cat, Mouse, Dog, Dog, Parrot, Mouse, Hound } 我希望得到以下输出: { Cat, Parrot, Hound } myList.Where(i=>myList.Count(j=>j==i)myList.Count(j=>j==i)

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

例如,给定此输入数组:

{ Dog, Cat, Mouse, Dog, Dog, Parrot, Mouse, Hound }
我希望得到以下输出:

{ Cat, Parrot, Hound }
myList.Where(i=>myList.Count(j=>j==i)<2);
请注意,这依赖于
==
操作符是一个足够好的比较(尽管您可以用您想要的任何比较替换它)。它也不是很有效,尽管我怀疑其他任何答案也会是

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

myList.Where(i=>myList.Count(j=>j==i)<2);
请注意,这依赖于
==
操作符是一个足够好的比较(尽管您可以用您想要的任何比较替换它)。它也不是很有效,尽管我怀疑其他任何答案也会是


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

您可以尝试以下方法:

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

您可以尝试以下方法:

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

您可以使用一点Linq:

var singles = myArray
    .GroupBy(x => x)
    .Where(g => g.Count() == 1)
    .SelectMany(g => g);
或者像这样:

Array.GroupBy(x => x).Where(x => x.Count() == 1).SelectMany(x => x);
var singles = myArray
    .GroupBy(x => x)
    .Where(g => !g.Skip(1).Any())
    .SelectMany(g => g);
  • 该方法将收集所有相似的元素
  • 该方法将筛选出不满足特定条件的组。我提供了两个可选条件,但它们都执行相同的操作,只有在组中正好包含一个元素时,它们才会返回
    true
    • g.Count()==1
      统计每个组中的元素数,如果结果等于1,则返回
      true
    • !g、 跳过(1)。如果在第一个()之后没有元素,则Any()将返回
      true
      。这实际上比
      g.Count()==1
      稍微有效一些,因为它不需要枚举组中的所有元素,但对一些读者来说有点混淆,所以在生产代码中引入此功能之前请三思
  • 最后,将返回结果集合中的所有元素。因为每个组中只有一个元素,所以只剩下那些不重复的元素

您可以使用一点Linq:

var singles = myArray
    .GroupBy(x => x)
    .Where(g => g.Count() == 1)
    .SelectMany(g => g);
或者像这样:

Array.GroupBy(x => x).Where(x => x.Count() == 1).SelectMany(x => x);
var singles = myArray
    .GroupBy(x => x)
    .Where(g => !g.Skip(1).Any())
    .SelectMany(g => g);
  • 该方法将收集所有相似的元素
  • 该方法将筛选出不满足特定条件的组。我提供了两个可选条件,但它们都执行相同的操作,只有在组中正好包含一个元素时,它们才会返回
    true
    • g.Count()==1
      统计每个组中的元素数,如果结果等于1,则返回
      true
    • !g、 跳过(1)。如果在第一个()之后没有元素,则Any()将返回
      true
      。这实际上比
      g.Count()==1
      稍微有效一些,因为它不需要枚举组中的所有元素,但对一些读者来说有点混淆,所以在生产代码中引入此功能之前请三思
  • 最后,将返回结果集合中的所有元素。因为每个组中只有一个元素,所以只剩下那些不重复的元素

    • 使用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);
              }
      
      var list=新列表{“狗”、“猫”、“老鼠”、“狗”、“狗”、“鹦鹉”、“老鼠”、“猎犬”};
      //var list=新列表{“a”、“b”、“a”、“c”、“a”、“b”};
      变量q=(从列表中的x开始)
      将x按x分组为g
      让计数=g.计数()
      其中count==1
      orderby计数递减
      选择g键);
      foreach(q中的变量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);
              }
      
      var list=新列表{“狗”、“猫”、“老鼠”、“狗”、“狗”、“鹦鹉”、“老鼠”、“猎犬”};
      //var list=新列表{“a”、“b”、“a”、“c”、“a”、“b”};
      变量q=(从列表中的x开始)
      将x按x分组为g
      让计数=g.计数()
      其中count==1
      orderby计数递减
      选择g键);
      foreach(q中的变量x)
      {
      控制台写入线(x);
      }
      
      我在Stackoverflow&google上找不到这个问题的答案,为什么会有这么多反对票?你似乎有三个答案,所以可能是我,但我不明白你的意思。你想把狗搬走吗?(顺便说一句,我没有投反对票)我在Stackoverflow&google上找不到这个问题的答案,那么为什么这么多反对票?你似乎有三个答案,所以可能是我,但我不明白你的意思。你想把狗搬走吗?(顺便说一句,我没有投反对票)看起来不错,而且解释得很好。将尝试以下方法:)@Selman22 OP不希望只使用不同的元素,而是只使用在输入数组中不会出现多次的元素。看起来不错,而且解释得很好。将尝试以下方法:)@Selman22 OP不希望只使用不同的元素,而是只使用在输入数组中不会出现多次的元素。看起来很简单,可以完成它的任务。Thankslook很简单,可以完成它的工作。谢谢,这会起作用,但在较大的列表上需要很长时间,因为它必须检查每个项目的整个列表。@JimMischel,是的,它绝对有这个问题。“分组方式”效率更高,但我没有及时想出一个有效的方法:)虽然这会起作用,但在较大的列表上需要很长时间,因为它必须遍历每个项目的整个列表。@JimMischel,是的,它绝对有这个问题。分组方法效率更高,但我没有及时想出一个有效的方法:)