[英]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.