【问题标题】:Where does the x come from in this lambda expression? [duplicate]这个 lambda 表达式中的 x 来自哪里? [复制]
【发布时间】:2017-04-01 12:05:48
【问题描述】:

所以我在互联网上四处寻找有关排序技术的信息,然后偶然发现了 lambda。 现在我不完全确定它是如何工作的,而且我找不到任何可以将它分解到我的水平的教程。

这就是我试图打破的。

var sorted = list.OrderBy(x => new MailAddress(x).Host).ToList();

所以我知道我创建了一个名为 sorted 的变量,这将是保存列表中已排序项目的变量。

这是我不明白的部分

OrderBy(x => new MailAddress(x).Host)

x 来自哪里,lambda 表达式到底是什么意思? => 它不像这个表达式!= 这意味着NOT。 我知道它是按主机排序的,比如 Yahoo、GMAIL 和 Hotmail。

【问题讨论】:

  • 我认为您的问题可能是“什么是 lambda 表达式?”
  • "x" 只是一个标识符
  • MS 文档:Lambda Expressions (C# Programming Guide) x 被称为输入参数
  • 这里的答案也很有用stackoverflow.com/questions/3832337/…
  • 如果有人能以委托人的身份写出这个 lambda 表达式,我会非常高兴!然后我实际上可以看到它是如何分解的,代码背后的解剖学。

标签: c# .net lambda


【解决方案1】:

简单来说,x 是您声明的变量。

所以它读取 "x such that x is"...根据查询的输入和输出参数,您尝试传达的任何表达式。

再举一个例子:

var sorted = list.Where(x => x.Name == "Foo").ToList();

这读作“x 使得 x 等于 Foo”。这将返回 Name 属性等于 Foo 的所有列表。

为了进一步解释这一点,让我们看一下重载的 Enumerable 方法之一,即“Where”。根据 MSDN:

实际语法是:

Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate

再举一个例子,让我们声明一个整数列表。我们的目标是得到所有偶数:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

现在要查询所有偶数整数,我们将使用 Where 扩展方法的重载版本之一,使用 lambda 语法。它说:

所以这里的来源是:

numbers.Where();

因为“numbers”变量是 TSource 的 IEnumerable。 这里的 TSource 是“T”类型的任何 IEnumerable 或任何类型的实体。

现在最后一部分是它接受一个 Func。 Func 是预定义的委托类型。它为我们提供了一种以通用和简单的方式存储匿名方法的方法。为了进一步理解这一点,让我们再读一遍。它表示它将接受一个来源,并且将输出一个布尔结果

现在让我们创建一个接受 TSource 的 Func,在本例中,integer 作为我们的示例,并将输出布尔结果

Func<int, bool> fncParameter = x => x % 2 == 0;

现在我们可以将它传递给我们的:

numbers.Where

这将是:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Func<int, bool> fncParameter = x => x % 2 == 0;
IEnumerable<int> result = numbers.Where(fncParameter);

简而言之:

ist<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IEnumerable<int> result = numbers.Where(x => x % 2 == 0);

【讨论】:

  • 我认为你把 OrderByWhere 搞混了。
  • 您是否有机会在不和谐或类似的事情上更详细地解释这一点?
  • 我更新了我的答案。让我知道它是否有帮助或您有任何疑问。 @ChristofferNilsson
  • 这更有意义!如果你能用我上面发布的代码行做一个例子,那就太棒了!不会问你,因为你可能有更好的事情要做,但如果你有时间,请随意!我会将其标记为已接受的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多