[英]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.