Array.Distinct()
留下了不同的元素。如何从Array 中删除所有重复元素,包括原始元素?
例如,给定此输入数组:
{ Dog, Cat, Mouse, Dog, Dog, Parrot, Mouse, Hound }
我想得到这个输出:
{ Cat, Parrot, Hound }
答案 0 :(得分:8)
你可以使用一点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
将返回结果集合中的所有元素。由于每个组中只有一个元素,因此只剩下那些不重复的元素。答案 1 :(得分:2)
您可以尝试这样的事情:
Array.GroupBy(x => x).Where(x => x.Count() == 1).SelectMany(x => x);
答案 2 :(得分:1)
myList.Where(i => myList.Count(j => j == i) < 2);
请注意,这依赖于==
运算符是一个足够好的比较(尽管你可以用你想要的任何比较替换它)。它也不是很有效,但我怀疑其他任何答案都是。
这可以通过将结果限制为在源列表中不会出现多次的元素来实现。
答案 3 :(得分:1)
使用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 :(得分:0)
int []s={1,2,2,3,5,4,4};
int[] q = s.Distinct().ToArray();
它将返回{1,2,3,5,4}