【问题标题】:How to return a unique element from a C# array如何从 C# 数组中返回唯一元素
【发布时间】: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 岁

标签: c# arrays linq


【解决方案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();
                }
        

        【讨论】:

          猜你喜欢
          • 2018-12-25
          • 1970-01-01
          • 2019-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-18
          • 2022-01-15
          • 2020-08-16
          相关资源
          最近更新 更多