删除多次出现的数组元素
本文关键字:数组元素 删除 | 更新日期: 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);
请注意,这取决于==
运算符是否是一个足够好的比较(尽管您可以用任何想要的比较来替换它(。它也不是很有效,尽管我怀疑其他任何答案都会是。
这是通过将结果限制为不会在源列表中多次出现的元素来实现的。