【问题标题】:What is the cleanest way to ensure a set of values are all unique?确保一组值都是唯一的最干净的方法是什么?
【发布时间】:2012-10-16 13:22:20
【问题描述】:

假设我有五个整数值,它们都必须是唯一的。

int a;
int b;
int c;
int d;
int e;

显然我可以做这样的事情来测试:

if (a == b) {
    return false;
} else if (a == c) {
    return false;
} else if (a == d) {
    return false;
}
//etc etc

但在我看来,这会导致代码非常混乱。有没有一种“更清洁”的方式来做到这一点?

【问题讨论】:

    标签: c# logic


    【解决方案1】:

    您可以将所有值放入一个集合中,并确保该集合的基数等于您放入的值的数量:

    ISet<int> vals = new HashSet<int> {
        a, b, c, d, e
    };
    if (vals.Count != 5) {
        Console.WriteLine("All values must be unique");
    }
    

    【讨论】:

      【解决方案2】:

      可能有点开销,但你可以这样做:

      new [] {a, b, c, d, e}.Distinct().Count() == 5
      

      【讨论】:

      • 对于一小部分变量,我确信Distincting 的开销然后计数可以忽略不计。
      【解决方案3】:
      List<int>() list = new List<int>(){a,b,c,d,e};
      
      bool unique = list.Count() == list.Distinct().Count();
      

      【讨论】:

        【解决方案4】:

        未经测试,但您也可以制作这样的辅助方法:

        static bool AreDistinct<T>(params T[] vals)
        {
            for(int i = 0; i < vals.Length - 1; i++)
                for(int j = i + 1; j < vals.Length; j++)
                    if(vals[i].Equals(vals[j]))
                        return false;
        
            return true;
        }
        

        然后这样称呼它:

        AreDistinct(a, b, c, d, e)
        

        【讨论】:

        • +1 简洁的代码 - 当我提出这个问题时,我有点想按照这些思路,但我认为在我的具体情况下这将是矫枉过正。
        • 这个的好处是它是可重用的,可以埋在 Utilities 类中,并且在你调用它的时候进行自我记录。缺点是你必须把它放在某个地方。
        • @Ic 确实如此。我将来肯定会使用它-但您的其他答案非常适合这个特定项目-谢谢!
        【解决方案5】:
        List<int> elements = new List<int>(){a,b,c,d,e};
        if (elements.Distinct().Count() == elements.Count)
        {
            //all elements are different
        }
        else
        {
        
        }
        

        【讨论】:

          【解决方案6】:

          由于您一次只比较两个值,因此您将有 (n-1)!比较。

          你真的应该考虑一下 Ic. 的回答。他将 j 偏移 i 的值 +1 以避免冗余比较。这是尽可能简洁和高效的方法。

          但是,如果你必须写出比较:

          if (a == b || a == c || a == d || a == e)
              return false;
          
          if (b == c || b == d || b == e)
              return false;
          
          //etc.
          

          【讨论】:

            【解决方案7】:

            清洁度可能会引起争议,但如果您对它们进行排序,那么(根据需要)比较您所在的每个相邻对 (n lg n) 而不是 (n^2)。

            【讨论】:

              猜你喜欢
              • 2022-06-20
              • 2021-10-29
              • 1970-01-01
              • 1970-01-01
              • 2019-12-19
              • 2014-05-03
              • 1970-01-01
              • 1970-01-01
              • 2021-04-14
              相关资源
              最近更新 更多