【问题标题】:check if the all values of array are different检查数组的所有值是否不同
【发布时间】:2014-08-11 21:19:16
【问题描述】:

我有一个这样的一维数组:

int[] values = new int[5] { 1, 2, 3, 4, 5 };

现在我这样做是为了检查所有值是否不同:

bool all_values_are_different()
{
   for(int i = 0; i < values.Length - 1; i++)
   {
      search = values[i];

      for(int j = i + 1; j < 5; i++)
      {
         if(search == values[i])
            return false;
      } 
   }

   return true;
}

C# 中是否有任何方法可以检查数组中的所有值是否不同?

【问题讨论】:

    标签: c# arrays distinct-values


    【解决方案1】:

    有几种方法:

    // 1
    values.Distinct().Count() == values.Length;
    
    // 2
    new HashSet<int>(values).Count == values.Length;
    
    // 3.1
    !values.Any(x => values.Count(y => x == y) > 1);
    
    
    // 3.2
    values.All(x => values.Count(y => x == y) == 1);
    

    如果其中任何一个表达式的结果为 false,则表示您的数组有重复项,否则所有元素都是唯一的。

    【讨论】:

      【解决方案2】:

      如果可能,您可以对数组进行排序。数据将就地进行排序,而无需像其他方法那样创建新数组,因此应该更快,尤其是当您希望稍后对数据进行排序时(例如二进制搜索或显示)。此外,它只是 O(n log n) 而不是 O(n2)

      Array.Sort(values);
      for (int i = 0; i < values.Length - 1; i++)
      {
          if (values[i] == values[i + 1])
              return false;
      }
      return true;
      

      当您需要排序数组和原始数组时,也可以复制到新的排序数组,或者仅仅因为您不想修改输入。我认为它仍然比 O(n2) 方法或一些使用集合的解决方案更快,尤其是对于大输入


      如果要保留原始数组,则另一种解决方案

      var valueList = new HashSet<int>();
      foreach (var v in values)
      {
          if (valueList.Contains(v)
              return false;
          else
              valueList.Add(v);
      }
      return true;
      

      这比 Selman Genç 的第二个解决方案更快,因为它不会填充整个集合并尽可能早返回

      【讨论】:

        【解决方案3】:

        试试这个

         var duplicates = arrayToCheck
            .GroupBy(s => s)
            .Where(g => g.Count() > 1)
            .Select(g => g.Key);
        
        
           return (duplicates.Count() > 0);
        

        附言

        return  arraylist.Distinct().Count() == arraylist.Length; 
        

        【讨论】:

          猜你喜欢
          • 2015-06-18
          • 2012-05-20
          • 1970-01-01
          • 1970-01-01
          • 2013-01-27
          • 1970-01-01
          • 1970-01-01
          • 2020-12-27
          • 1970-01-01
          相关资源
          最近更新 更多