CS7036 C#in Array.FindAll + Lambda

时间:2016-01-26 03:34:01

标签: c#

我想将A更改为B. A是

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

List<int> evenList = new List<int>();
foreach ( var item in list )
{
  if (item % 2 == 0)
  {
    evenList.Add(item);
  }
}

foreach ( var item in evenList )
{
  Console.Write(item + ",");
}

和B是

List<int> evenList = list.FindAll((elem) => elem % 2 == 0);
evenList.ForEach(elem) => { Console.Write(elem + ","); } );

但是在B,我遇到了这样的错误:

CS7036  C# There is no argument given that corresponds to the required
formal parameter 'match' of 'Array.FindAll<T>(T[], Predicate<T>)'

PS。我添加了

using System;
using System.Collections.Generic;

有什么我忘记了吗?

3 个答案:

答案 0 :(得分:4)

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

List<int> evenList = Array.FindAll(list, elem => elem % 2 == 0).ToList();

evenList.ForEach(elem => { Console.Write(elem + ","); } );
  1. Array.FindAll不是扩展方法,所以你根本无法调用list.FindAll()
  2. Array没有ForEach,因此您需要转换evenList ToList()

答案 1 :(得分:2)

那是因为Array.FindAll是静态的,所以你应该像这样调用它:

var NewList = Array.FindAll(list, (elem) => elem %2 == 0);

来自MSDN:

Syntax:
public static T[] FindAll<T>(
    T[] array,
    Predicate<T> match
)

link:https://msdn.microsoft.com/en-us/library/1kkxfxdd(v=vs.110).aspx

干杯

编辑:

编程不是一种猜测游戏,你试图在不尊重正确语法的情况下编写代码。

这是你应该做的:

        int[] list = { 1, 2, 3, 4, 5 };
        List<int> evenList = Array.FindAll(list, elem => elem % 2 == 0).ToList();
        Console.Write(string.Join(",", evenList) );

答案 2 :(得分:0)

你没有使用Linq的原因?它更新,适用于任何类型的集合,而不仅仅是int[]

using System.Linq;

Console.Write(list
    .Where(i => i % 2 == 0)
    .Select(i => i.ToString())
    .DefaultIfEmpty()
    .Aggregate((a, b) => a + "," + b));

Performancewise,这将以与for循环相同的复杂性执行,但总体上可能稍微慢一点(尽管我实际上认为它不会慢得多)。 Linq懒洋洋地评估这里有帮助。