【问题标题】:Using lambda expressions in array.convertall()在 array.convertall() 中使用 lambda 表达式
【发布时间】:2020-05-27 10:40:54
【问题描述】:

我还在熟悉委托和 lambda,我没有使用 LINQ,而且我也是今天才发现 ConvertAll 函数,所以我正在试验并询问它以加强我的理解。

我的任务是确定一串数字是偶数还是奇数。因此,首先,将字符串列表转换为 int 列表,然后从那里转换为 bool 列表。尽管代码很臃肿,但我想知道是否可以将所有内容集中在一行上并减少对额外 for 循环的需求。

string numbers = "2 4 7 8 10";

List<bool> evenBools = new List<bool>(Array.ConvertAll(numbers.Split(' '), (x = Convert.Int32) => x % 2 == 0))

预期结果是 [true, true, false, true, true]。显然代码不起作用。

我了解Array.ConvertAll) 的第二个参数需要进行对话。从字符串到整数,就是Convert.ToInt32。是否可以即时执行此操作(即在 lambda 表达式的左侧),以便我可以继续进行 bool 转换并在右侧返回?

【问题讨论】:

  • "(即在 lambda 表达式的左侧)" - =&gt; 的左侧只是 永远 参数列表,可能在括号中,可能使用隐式类型。目前尚不清楚您对 x = Convert.Int32 的预期含义,但您应该重新设置对 =&gt; 左侧可能出现的内容的预期。
  • Linq 来了之后,在你的情况下没有需要使用Array.ConvertAll&lt;&gt;(但这是可能的)。你可以做var evenBools = numbers.Split(' ').Select(x =&gt; Convert.ToInt32(x) % 2 == 0).ToList();

标签: c# .net lambda


【解决方案1】:

ConvertAll 方法的第二个参数是Converter&lt;TInput,TOutput&gt; 委托。这里可以使用匿名方法,将字符串input传递给它(=&gt;的左侧),解析到int里面,返回bool值,表示是偶数还是奇数

var boolArray = Array.ConvertAll(numbers.Split(' '), input => Convert.ToInt32(input) % 2 == 0);
List<bool> evenBools = new List<bool>(boolArray);

最后从数组中创建一个List&lt;bool&gt;

lambda expressions 的左侧仅包含输入参数(在您的情况下为input 字符串)。右侧用于表达式和语句,这里有一个解析逻辑并返回一个bool 值。

System.Linq的帮助下,可以用类似的方式编写

var boolArray = numbers.Split(' ').Select(input => Convert.ToInt32(input) % 2 == 0).ToArray();

您也可以使用int.Parse 代替Convert.ToInt32

【讨论】:

  • @TomPengelly 是否回答了您的问题,您需要更多详细信息或信息吗?
【解决方案2】:
var boolList = numbers.Split(' ').Select(Int32.Parse).ToList().ConvertAll(i => i % 2 == 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多