如何按长度降序对字符串列表的内容进行排序?
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.List
1[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();
我想按长度降序对短语字符串列表进行排序,这样:
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.List
1[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();