将IList<string>转换为List<string>()

5
我有一个函数,它以IList<string> someVariable作为参数。我想将其转换为列表,以便按字母顺序对值进行排序。
如何实现这一点?

1
你实际上需要对列表进行排序,还是只需要按特定顺序迭代它? - Roman
5个回答

8
你可以只是做
var list = new List<string>(myIList);
list.Sort();

或者

var list = myIList as List<string>;
if (list != null) list.Sort; // ...

仅仅因为给定的 IList<T> 不是特定的 List<T>,并不意味着你不能对它进行排序。ReadOnlyCollection 实现了 IList<T> 但不是 List<T>。你仍然可以复制它并进行排序。你发布的第二个示例是错误的。 - Roman
或许我表达不够清晰 - 这并不是错的,只是在这种情况下不起作用(排序将不会被调用)- 但还是感谢你的提示 - 我想这里有足够多的示例供选择 :) - Random Dev
在这种情况下,如何说“不起作用”是正确的?假设IList<T>是如何实现的是一个无关紧要的实现细节,可能会在没有警告的情况下发生更改。你的第二个例子将悄悄地停止运行。我认为,在没有必要的情况下强制使用显式依赖是错误的。 - Roman
你的第一个例子正是我想要的。谢谢。 - hoakey

7
IList<string> someVariable = GetIList();
List<string> list = someVariable.OrderBy(x => x).ToList();

6

IList 实现了 IEnumerable 接口。使用 .ToList() 方法。

var newList = myIList.ToList();
newList.Sort();

1
我认为你需要在 .ToList 之前调用 .Cast<> - user195488

2
您可以使用linq对IList<string>进行排序,方法如下:
IList<string> foo = .... ; // something
var result = foo.OrderBy(x => x);

2

您不必将内容转换为列表即可进行排序。如果您的排序方法需要一个List但不接受IList,则我认为这是实际问题。

此外,如果您真的需要一个List,如果您的IList实际上是一个List(这在某种程度上是可能的),您可以将其解释为这样。因此,我会先检查它是否已经是一个List,然后再创建一个新的List。

var concreteList = parameter as List<T> ?? parameter.ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接