如何从 C# 数组中返回唯一元素
Posted
技术标签:
【中文标题】如何从 C# 数组中返回唯一元素【英文标题】:How to return a unique element from a C# array 【发布时间】:2021-09-21 10:04:53 【问题描述】:问题
我正在尝试使用内置方法 array.Distinct.First()
从 C# 数组中返回唯一元素。该方法适用于某些数组,但返回此数组11,11,11,14,11,11
的错误元素。它给了我11
的输出,这是不正确的,因为该数组中的唯一元素应该是14
。
我知道有一种方法可以使用 predicate
函数来做到这一点,但这就是我问的原因,我不知道
代码
public static int getUnique(IEnumerable<int> numbers)
return numbers.Distinct().First();
//you can bet i tried .FirstOrDefault()
//without any success
非常感谢任何有助于使该代码返回正确值的帮助。
【问题讨论】:
那不是distinct does11,11,11,14,11,12
等场景应该返回什么?
array.GroupBy(x => x).Where(x =>x.Count() == 1).First()
好的,我需要查看更多 C# 文档,我认为它会返回数组的唯一元素。它还返回其他数组本身的唯一元素
@Liam,14 岁和 12 岁
【参考方案1】:
Distinct 不是这样做的。
它会从一个序列中返回不同的元素,从而删除重复的元素。
您只希望开头没有重复的项目;
var numbers = new int[] 11, 11, 11, 14, 11 ;
foreach (var i in numbers.GroupBy(i => i).Where(g => g.Count() == 1).Select(g => g.Key))
Console.WriteLine(i);
你显然想要第一个不重复的值,所以你会得到这样的东西;
var numbers = new int[] 11, 11, 11, 14, 11 ;
int? firstNonDuplicate = numbers.GroupBy(i => i).Where(g => g.Count() == 1).Select(g => g.Key).FirstOrDefault();
Console.WriteLine(firstNonDuplicate);
不过,这里的空检查有所不同,这只是证明了一点。
【讨论】:
感谢兄弟的帮助,您可以编辑以使其将谓词结果分配给更容易返回的单个 int 变量 好了,@KINYUATIMOTHYNJIRU【参考方案2】:使用 distinct 它将返回所有不同的元素。通过以下方式获取唯一值
int[] numbers = 11, 11, 11, 14, 11 ;
Console.WriteLine(numbers.GroupBy(i => i).Where(g => g.Count() == 1).Select(g => g.Key).First());
【讨论】:
【参考方案3】:一般来说,您应该按键对集合进行分组,然后按包含元素的数量对其进行过滤:
var groupings= numbers.GroupBy(x => x)
.Where(x => x.Count() == 1)
.Select(x => x.Key);
现在它为您提供所有个唯一编号。你的问题有点模糊,因为你想要“一个”唯一的数字 - 而不是“那个”唯一的数字,所以有解释的余地,如果有多个数字会发生什么。
选项1:只取第一个结果:
var uniques = numbers.GroupBy(x => x)
.Where(x => x.Count() == 1)
.Select(x => x.Key)
.First();
选项 1.1 排序结果并取最小(或最大)
var uniques = numbers.GroupBy(x => x)
.Where(x => x.Count() == 1)
.Select(x => x.Key)
.OrderBy(x => x)
.First();
选项 2:确保只有一个唯一编号,否则抛出:
var uniques = numbers.GroupBy(x => x)
.Where(x => x.Count() == 1)
.Select(x => x.Key)
.Single();
注意:如果没有唯一数字,Single()
和First()
会抛出,而SingleOrDefault()
和FirstOrDefault()
会返回默认值int
,即0
,可以导致错误的结果。如果没有唯一编号,您可以考虑将其更改为 int?
以允许返回 null
。
【讨论】:
【参考方案4】:你可以试试下面的代码。
var numbers = new int[] 11, 11, 11, 14, 11, 11 ;
var uniqueList = numbers.GroupBy(n => n).Where(item => item.Count() == 1).Select(item => item.Key);
foreach (var item in uniqueList)
Console.WriteLine(item);
【讨论】:
【参考方案5】:我为你做了一个特殊的方法。我有点原始地接近这个主题。借助这种方法,您可以轻松找到唯一变量。
public static int[] getUniqiue(int[] vs)
List<int> vs1 = new List<int>(vs);
List<int> vs2 = new List<int>(vs);
List<int> ee = new List<int>();
List<int> vs3 = new List<int>();
int i = 0;
foreach (var item in vs1)
vs2.Remove(item);
if(vs3.Contains(item) || vs2.Contains(item))
vs3.Add(item);
else
ee.Add(item);
i++;
return ee.ToArray();
【讨论】:
以上是关于如何从 C# 数组中返回唯一元素的主要内容,如果未能解决你的问题,请参考以下文章