2009-05-06 80 views
1

我检讨我们的承包商之一的一些代码:我对这段代码的理解是否正确?

if (userLists != null) 
{ 
    Int32 numberOfItems = userLists.Count; 
    if ((numberOfItems & 1) == 1) 
    { 
     var emptyList = new tblList(); 
     userLists.Add(emptyList); 
    } 
} 

现在,我想明白这一点,所以,可以有人请我确认如果我有这个正确与否?

  1. 我们有一个userList的实例吗?
  2. 是的。获取userLists对象中的项目数量。
  3. if(项数等于1(是/ true)AND 1等于1(yes/True))并且结果等于1(是/ True),然后向列表中添加一个空列表对象。
  4. 其他:没什么。

如果是这样(WTFFFFFFFFFFFFFFFFFFFF !!!!!!!!!!),可重构为

if (numberOfItems == 1) 
{ 
.. 
} 

但即使这是废话,因为我不想用“空列表'项目。

所以我读了这段代码是否正确?

哦,在使用Int32 VS Int一个更感叹:((但我离题)。

+0

这是一个例子,其中一个扩展或辅助方法或解释变种会帮忙与代码可读性。例如,代替(numberOfItems&1)== 1:numberOfItems.IsOdd()或IsOdd(numberOfItems)或isOdd =(numberOfItems&1)== 1; – 2009-05-06 05:50:05

+0

完全同意三宝! JP回复了一个很好的扩展方法:) – 2009-05-06 05:53:45

回答

6

&是所谓的按位运算符。而运营商&&测试两个布尔值:

TRUE && FALSE => FALSE 
TRUE && TRUE => TRUE 

&操作员可以在整数值工作:

00101101 (45) 
& 01011011 (91) 
--------------- 
= 00001001 (9) 

每一位具有布尔操作(和)就可以完成。所以在你的代码示例的情况下,它会问“最后一位是1?” - 也就是说“这很奇怪吗?”举例来说,如果数字是23:

00010111 (23) 
& 00000001 (1) 
--------------- 
= 00000001 (1) 

因此,添加到列表中,因为1 == 1,但如果人数为22:

00010110 (22) 
& 00000001 (1) 
--------------- 
= 00000000 (0) 

所以它不添加到列表。

3

检查奇怪的,也可以做i % 2 != 0

我建议在看BitMasks他们可以很得心应手,但不是在你的问题中的代码,我想,如果你需要做的奇/偶喜欢模二。

static void Main(string[] args) 
    { 
     for (int i = 0; i < 100; i++) 
      Console.WriteLine(i & 1); 
     Console.ReadLine(); 
    } 


1 
0 
1 
0 
1 
0 

并为它赫克,这里的一些推广方法

class Program 
    { 
     static void Main(string[] args) 
     { 
      List<int> ints = new List<int>(); 

      for (int i = 0; i < 100; i++) 
      { 
       Console.WriteLine("Mod: {0}", i % 2); 
       Console.WriteLine("BitWise: {0}", i & 1); 

       ints.Add(i); 
       Console.WriteLine("Extension: {0}", ints.IsEven()); 
      } 
      Console.ReadLine(); 
     } 
    } 

    public static class ListExtensions 
    { 
     public static bool IsEven<T>(this ICollection<T> collection) 
     { 
      return (collection.Count%2) == 0; 
     } 

     public static bool IsOdd<T>(this ICollection<T> collection) 
     { 
      return (collection.Count%2) != 0; 
     } 
    } 
+0

同意的队友!我更喜欢modulo,当然! – 2009-05-06 05:46:36

+1

+1,使用mod而不是按位AND使得代码的意图在进行奇数/偶数检查时更加明显。 – LukeH 2009-05-06 09:05:27

6

按位与1进行AND运算,检查数字是奇数还是偶数(如果奇数则返回1)。该代码正在做的是,如果存在奇数个项目,则通过添加另一个项目来确保该列表具有偶数个项目。

0

(numberOfItems & 1)== 1

更像numberOfItems%2!= 0

0

为(numberOfItems & 1)== 1,这是一个按位与。它似乎在检查numberOfItems是否是奇数,并且如果是的话添加一个空列表。

0
((numberOfItems & 1) == 1) 

&与1测试第0位。对于整数数据类型,所有奇数值都设置为第0位,所有偶数值都将其清零。上面的代码有效地测试了奇数值。

0

可重构更易懂/维护:

if (userLists != null) 
{  
    EnsureListHasAnEvenNumberOfItems(userLists); 
} 
+0

或者:bool ListHasOddLength = userLists.Count%2 == 1; if(ListHasOddLength)userLists.add(new tblList()); //抽象而不必跳转到不同的方法 – 2009-05-06 05:54:14

0

为零元素好吗?

x =(0 & 1)然后 (x == 1)为false ...

我想你应该问你的承包商更多地评论他们的代码。

3

因为我们傻...

public static class Extensions 
{ 
    public static bool IsEven(this Int32 integer) 
    { 
     return (integer % 2 == 0); 
    } 
} 

让我们做什么...

numberOfItems.IsEven()