【问题标题】:Why doesn't C# .NET SortedList<T1, T2> actually have ElementAt?为什么 C# .NET SortedList<T1, T2> 实际上没有 ElementAt?
【发布时间】:2012-08-02 19:06:03
【问题描述】:

.NET Documentation for 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' 的定义,并且找不到接受类型为 'System.Collections.Generic.SortedList&lt;int,ChainLink&gt;' 的第一个参数的扩展方法 'ElementAt'(您是否缺少 using 指令还是程序集参考?)

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

【问题讨论】:

  • 您是否缺少对 System.Linq 的引用?
  • 您是否已将using System.Linq; 添加到您的代码文件中?
  • 您是否已将 Resharper 添加到您的 Visual Studio 中?
  • 嗯。锐器?虽然很有用,但与这个问题有什么关系?
  • Resharper 会自动建议添加对命名空间System.Linq 的引用! =)

标签: c# .net sortedlist


【解决方案1】:

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

using System.Linq;

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

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

在 Visual Studio 中,当您创建新的类文件时,您将在顶部自动插入 using System.LinqThat namespace 包含所有 LINQ extension methods 用于处理各种集合(包括列表、字典和数组)。

【讨论】:

  • +1 好答案。但我必须挑剔。 using 指令不是“导入”,也不会发生“导入”。 using 指令是一种别名机制。 tergiver.wordpress.com/2011/03/11/…
  • 当然,扩展方法有点奇怪,因为如果它们的包含命名空间没有别名,它们根本就不存在。
  • 好吧,我同意你的看法,所以我调整了它。
  • @Tergiver,最糟糕的是,在引用扩展方法的文档中(请参阅我的链接),没有提到 System.Linq。当我阅读标题为“SortedList 成员”的文档时,我希望他们指的是在我可以创建新的 SortedList 或使用所述 SortedList 的任何地方都可用的东西。
【解决方案2】:

你添加了吗

using System.Linq;

在文件的顶部?

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

【讨论】:

  • 不需要RTFM。显然,海报是新的扩展方法,即使他读了也不明白。 RTFM 只是没有帮助。
  • 是的,你是对的。不是报复的意思。已更正。不过,我觉得原帖略显粗俗的性质是放错了地方。
  • 之所以会发脾气实际上是因为我 RTFM,而唯一提到命名空间的地方是一个很小的链接在扩展方法的文档的顶部(没有基本信息的地方,对吗?)。当我单击标题为“SortedList Members”的链接时,我希望这些成员位于同一个命名空间中。在 SortedList 文档中,我找不到对 System.Linq 的引用。但现在我知道了——微软并没有说“这些东西来自这里,点击了解如何使用它”。相反...
  • “这里有一些东西,”让我自己去找出从哪里得到它。 (此外,我已经对两个同名类之间明显的不一致感到沮丧。我有点讨厌。)
【解决方案3】:

SortedListSortedList&lt;K,V&gt; 是非常不同的野兽。

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

请注意,当您使用扩展方法ElementAt() 时,它可能会执行“tablescan”,不要将其用于时间紧迫的事情。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 2015-11-06
    • 1970-01-01
    • 2014-08-26
    • 2010-12-18
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多