如何从 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 does 11,11,11,14,11,12等场景应该返回什么? array.GroupBy(x =&gt; x).Where(x =&gt;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# 数组中返回唯一元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从每个线程的数组中读取唯一元素?

如何从 JS 中的 2 个对象数组中找到唯一元素

带有 JObject 元素的 C# JsonResult 返回空数组

如何从列表数组(linq 列表)C# 中的所有元素调用方法

如何创建具有最大元素的唯一键数组?

从jquery中的数组中获取唯一元素和元素的数量[重复]