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
统计每个组中的元素数,如果结果等于1,则返回g.Count()==1
true
!g、 跳过(1)。如果在第一个()之后没有元素,则Any()将返回
。这实际上比true
稍微有效一些,因为它不需要枚举组中的所有元素,但对一些读者来说有点混淆,所以在生产代码中引入此功能之前请三思g.Count()==1
- 最后,将返回结果集合中的所有元素。因为每个组中只有一个元素,所以只剩下那些不重复的元素
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
统计每个组中的元素数,如果结果等于1,则返回g.Count()==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,是的,它绝对有这个问题。分组方法效率更高,但我没有及时想出一个有效的方法:)