繁体   English   中英

OrderBy中lambda表达式的重点是什么?

[英]What's the point of lambda expression in OrderBy?

我有一个字符串列表,我想订购它们。

IEnumerable<String> strings = ...;
strings = strings.OrderBy(a => a);

我没有得到的是lambda表达式a => a的重点。 首先,我认为我可以像这样拿出一个房产和订单。

IEnumerable<Something> somethings = ...;
IEnumerable<String> strings = somethings.OrderBy(a => a.StringProperty);

但那不编译。 所以我必须这样做。

IEnumerable<Something> somethings = ...;
IEnumerable<String> strings = somethings.Select(a
  => a.StringProperty).OrderBy(a => a);

那么为什么我强制要在OrderBy命令中使用lambda表达式?!

lambda表示“你想要订购什么”。

如果你带一群人,并在他们的生日订购,你仍然有一组人 - 而不是一组生日;

IEnumerable<Person> people = ...;
IEnumerable<Person> sorted = people.OrderBy(a => a.DateOfBirth);

所以类似地,通过StringProperty排序一组Something仍然会产生一组Something s:

IEnumerable<Something> somethings = ...;
IEnumerable<Something> sorted = somethings.OrderBy(a => a.StringProperty);

在一些(很少)的情况下,你实际上意味着“并通过事物本身对其进行排序”。 这通常仅适用于IEnumerable<string>IEnumerable<int> - 因此.OrderBy(x => x)的轻微不便是微不足道的。 如果它困扰你,你总是可以写一个扩展方法来隐藏这个细节。

当您订购一个集合时,它不会改变它的类型

IEnumerable<Something> somethings = ...; 
var strings = somethings.OrderBy(a => a.StringProperty);

导致IEnumerable<Something> ,你必须选择属性来改变类型:

IEnumerable<String> strings = somethings
    .OrderBy(s => s.StringProperty)
    .Select(s => s.StringProperty);

那么为什么我强制要在OrderBy命令中使用lambda表达式?!

因为Enumerable.OrderBy是一个需要参数的方法。

因为您没有选择它,所以您可以通过它进行订购。

尝试这个:

Console.WriteLine(string.Join(", ",
    new[] { new { Int = 1 }, new { Int = 2 }, new { Int = 0 }
    .OrderBy(a => a.Int));

这将为您提供由Int属性排序的列表,而不仅仅是随机排序!

这意味着您可以按对象的任何属性进行排序,而不仅仅是对象本身。

.OrderBy(TSource, TKey)方法的结构要求Source项和要排序的项。 lambda说“使用TKey订购TSource”,或者在你的情况下,“订购a使用”

OrderBy参数lambda的目的是准确地告诉用于排序的标准。 它需要一个你正在排序的对象,并返回另一个将被排序的“东西”(相同或不相同的类型),排序提取要从原始源排序的密钥。

你的第一个样本非常简单,你的咆哮在某种程度上是合理的,因为如果你从一个字符串列表开始,你很可能会想要精确地按这些字符串排序。 这让我也很奇怪,为什么我们不能为那些微不足道的案例设置无参数的OrderBy

对于第二个片段:

IEnumerable<Something> somethings = ...;
IEnumerable<Something> strings = somethings.OrderBy(a => a.StringProperty);

这是“排序标准”有意义的时候,因为您通过从它们派生的某个属性值来对对象进行排序,而不仅仅是对象本身(通常不具有可比性)。 它不编译的原因是在第二个可枚举声明中,它应该是一个IEnumerable<Something>而不是IEnumerable<string> ,因为排序将返回另一个与它收到的类型相同的列表,但顺序不同, 无论排序标准如何

在第三个片段中,您可以通过Select字符串属性来解决这个问题,这会有效地生成字符串列表,但是会丢失进程中的所有输入对象。 lambda参数在这里或多或少是毫无意义的,因为你从一个普通的字符串开始,与第一个样本完全相同。

另一种使用它的方法是指定一些不同的排序标准,而不是字符串。 假设您不是按字母顺序排序,而是按第三个字母排序:

IEnumerable<String> strings = ...;
strings = strings.OrderBy(a => a.Substring(2, 1));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM