如何按长度降序对字符串列表的内容进行排序?

How can I sort the contents of a string list by length descending?

我想按长度降序对短语字符串列表进行排序,这样:

Rory Gallagher
Rod D'Ath
Gerry McAvoy
Lou Martin

最终会变成:

Rory Gallagher
Gerry McAvoy
Lou Martin
Rod D'Ath

我想先试试这个:

List<string> slPhrasesFoundInBothDocs;
. . . // populate slPhrasesFoundInBothDocs
slPhrasesFoundInBothDocs = slPhrasesFoundInBothDocs.OrderByDescending(x => x.Length);

...但是最后一行无法编译,intellisense 建议我将其更改为:

slPhrasesFoundInBothDocs = (List<string>)slPhrasesFoundInBothDocs.OrderByDescending(x => x.Length);

...我做到了。它会编译,但会抛出运行时异常,即“无法转换类型为 'System.Linq.OrderedEnumerable2[System.String,System.Int32]' to type 'System.Collections.Generic.List1[System.String]' 的对象。

我需要修复此代码,还是需要以完全不同的方式对其进行攻击?

使用这个:

slPhrasesFoundInBothDocs =
    slPhrasesFoundInBothDocs
        .OrderByDescending(x => x.Length)
        .ToList();

List<T>class的定义是:

public class List<T> :  IEnumerable<T>,...

List<T> class 继承自 IEnumerable<T>OrderByDescending 返回一个 IOrderedEnumerable<out TElement>——它也继承自 IEnumerable<T>.

IOrderedEnumerable接口的定义是:

public interface IOrderedEnumerable<out TElement> : IEnumerable<TElement>, IEnumerable

检查这个:

IEnumerable<string> enumerable1 = new List<string>{ "x","y"};
List<string> list1 = (List<string>)enumerable1; //valid

IEnumerable<string> enumerable2 =new  Collection<string>{ "x","y"};
List<string> list2 = (List<string>)enumerable2; //runtime error

每个 List<T>Collection<T> 都是一个 IEnumerable<T>,这总是正确的。但是不是说每个IEnumerable<T>都是List<T>

不会出现 IOrderedEnumerable<out TElement> 可以转换为 List 的情况,因为它们不在同一层次结构中。

因此,正如 @cee sharper 提到的,我们必须调用 ToList() 扩展方法,将 IOrderedEnumerable<out TElement> 转换为 List<T>:

List<string> list = new List{"x","xx","xxx"}.OrderByDescending(x => x.Length).ToList();