我有一个字符串列表,我想订购它们。
IEnumerable<String> strings = ...;
strings = strings.OrderBy(a => a);
我没有得到的是lambda表达式 a =&gt;的要点。那里的。首先,我认为我可以像这样拿出财产和订单。
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表达式?!
答案 0 :(得分:6)
lambda表示“你想要订购什么”。
如果你带一群人,并在他们的生日那天订购,你仍然有一群人 - 而不是一组生日;即。
IEnumerable<Person> people = ...;
IEnumerable<Person> sorted = people.OrderBy(a => a.DateOfBirth);
如此相似,按Something
排序StringProperty
s仍然会产生一组Something
s:
IEnumerable<Something> somethings = ...;
IEnumerable<Something> sorted = somethings.OrderBy(a => a.StringProperty);
在一些(极少数)案例中,你实际上的意思是“并按照事物本身对其进行排序”。这通常仅适用于IEnumerable<string>
或IEnumerable<int>
等内容 - 因此.OrderBy(x => x)
的轻微不便是微不足道的。如果它困扰你,你总是可以写一个扩展方法来隐藏这个细节。
答案 1 :(得分:2)
当你订购一个集合时,它不会改变它的类型,因此
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
是需要参数的方法。
答案 2 :(得分:1)
因为您没有选择它,所以您可以通过它进行订购。
试试这个:
Console.WriteLine(string.Join(", ",
new[] { new { Int = 1 }, new { Int = 2 }, new { Int = 0 }
.OrderBy(a => a.Int));
这将为您提供由Int
属性排序的列表,而不仅仅是随机订购的!
这意味着您可以按对象的任何属性进行排序,而不仅仅是对象本身。
答案 3 :(得分:1)
.OrderBy(TSource, TKey)
方法的结构要求Source项和要排序的项。 lambda说“使用TKey订购TSource”,或者在你的情况下,“订购a使用”
答案 4 :(得分:1)
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));