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

时间:2013-08-10 20:51:34

标签: c# linq

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

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表达式?!

5 个答案:

答案 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));