2015-11-04 92 views
0

我想编写一个程序,它可以从给定的整数数组中打印那些可以被3和9整除的数字。我想要使用内置扩展方法和lambda表达式。 我做了什么:Lambda表达式数字可被9和3整除c#

static void Main(string[] args) 
    { 
     List<int> l = new List<int>() {18,3,27,42}; 
     List<int> divBy3 = l.FindAll(x => (x % 9) == 0); 
     List<int> divBy9 = l.FindAll(x => (x % 3) == 0); 
     if (divBy9 == divBy3) 
     { 
       foreach (var num in divBy9) 
      { 
       Console.WriteLine("The numbers divisible by 9 and 3 are: {0}",num); 
      } 
     } 
     else 
     { 
      Console.WriteLine("There are no numbers divisible by 9 and 3."); 
     } 
    } 

和输出应该是{} 27,18。 我的输出总是else分支,但我不明白为什么。我试图把原始的整数数组中只有值{18,27},它应该验证相等性。在foreach中,我只是检查在divBy9列表中,因为我认为如果2个列表是相同的,只能在一个列表中检查,但我认为不好。 有什么问题?谢谢。

回答

1

平等没有做你认为它在做什么。它比较对象引用,它们不是相同的,因为它们是不同的对象。

您需要将divBy3中的每个元素都确定为divBy9,反之亦然。这是平等的。

0

您正在比较列表实例本身,即对象引用和它们不会相同,因为它们是不同的列表实例。有关更多详细信息,请参阅this

您想比较列表以查看它们是否包含相同的值。

有一个扩展方法,这将有助于你SequenceEqual

1

你正在创建两份不同名单,并通过引用比较它们和即使列表可能包含相同的元素(他们不这样做)的引用将永远是不同的所以你的代码将选择else分支。

由9整除的数字也可以被3整除你的测试似乎有点奇怪,但让我们假设你想找到可以被5和9整除的数字。然后拉姆达变为:

x => x%5 == 0 && x%9 == 0 

例如,

List<int> divBy5And9 = l.FindAll(x => x%5 == 0 && x%9 == 0); 

这将过滤源列表,只挑选了5都整除和9

+1

'X% 3 == 0'是没有意义的,因为它被'x%9 == 0'检查所隐含。 – MarcinJuraszek

+0

@MarcinJuraszek是的,我想你是对的,这是有点尴尬,因为我其实有一个数学学位。 –

+0

@BradfordDillon根据OP提供的样本输入和输出,他希望数字可以同时被9 **和** 3共同识别 - 输入序列中有'3',但不是期望的输出。 – MarcinJuraszek

4

你比较两个手柄,而不是在他们所代表的列表项的元素。而这不是你想要的要多,你想要的交集:

var intersect = divBy9.Intersect(divBy3); // returns an IEnumerable<int> 

我真的不知道你在想,虽然达到什么,结果总是会在divBy9因为数学原因。

此外,您可能应该停止使用已过时的FindAll,您可以使用Where来获得干净的Enumerable而不为临时阵列分配内存。

0

检查只在一个列表,

创建一个动态的实体,以持有的结果,如:

var numbers = Enumerable.Range(1, 50) // 1,2,3,...50 
         .ToList(); 

numbers.Where(nmb => (nmb % 3) == 0) // Give us all numbers divisible by 3. 
     .Select(nmb => new 
     { 
      Number = nmb, 
      By3 = true, 
      By3And9 = (nmb % 9) == 0 // The ones divisible by 9 
     }); 

结果:

enter image description here