4

.NET 3.5 Collections.Generic.SortedList 文档

在文档中,它明确指出“ElementAt”是SortedList成员的扩展方法。好吧,我有一个,这样宣布:

private SortedList<int, ChainLink> linksByLevel = new SortedList<int, ChainLink>();

我尝试获取最后一个元素:

ChainLink lastLink = linksByLevel.ElementAt(linksByLevel.Count - 1);

编译器会抛出非常有用的消息

错误 1 ​​'System.Collections.Generic.SortedList' 不包含 'ElementAt' 的定义,并且找不到接受类型 ' 的第一个参数的扩展方法 'ElementAt' System.Collections.Generic.SortedList<int,ChainLink>'(您是否缺少 using 指令或程序集引用?)

我对 Microsoft 的文档和我的编译器缺乏连贯性感到非常沮丧,并且很想吐槽 and 的 API 之间的不一致SortedListSortedList<T1, T2>但我怀疑这会给我的问题增加很多价值。相信我,这很令人沮丧:-\

4

3 回答 3

14

尝试将导入添加到代码文件的顶部:

using System.Linq;

您需要指定您正在使用包含扩展方法的命名空间,然后才能实际使用扩展方法。因此,正如错误所解释的那样,您缺少 -using指令。

如果您确实知道该方法是扩展方法,但您不知道它位于哪个命名空间中,那么您可能需要在线搜索才能找到它。默认情况下,Visual Studio 2012 无法为您解决它。您所说的扩展方法Enumerable.ElementAtSystem.LinqSystem.Core.dll 的命名空间中。

在 Visual Studio 中,当你创建一个新的类文件时,你会using System.Linq自动插入到顶部。该命名空间包含用于处理各种集合(包括列表、字典和数组)的所有LINQ 扩展方法。

于 2012-08-02T19:08:25.893 回答
4

你加了吗

using System.Linq;

在文件的顶部?

WRT 文档不一致,如果您查看 SortedList 文档,然后单击到 ElementAt,您会在页面顶部清楚地看到您需要包含 System.Linq。

于 2012-08-02T19:08:20.290 回答
2

SortedList并且SortedList<K,V>是非常不同的野兽。

较旧的 SortedList 在幕后使用数组,因此它可以提供高效的索引器。

Beware that when you use the extension method ElementAt() it will probably do a 'tablescan', don't use it for something time-critical.

于 2012-08-02T19:32:36.210 回答