【问题标题】:Could not access the First() method when inherited a class from Dictionary in C#从 C# 中的 Dictionary 继承类时无法访问 First() 方法
【发布时间】:2021-12-11 08:02:31
【问题描述】:

我通常可以在这样的 Dictionary 类型变量中使用First() 方法,

Dictionary<string,string> dic = new Dictionary<string,string>();
dic.Remove(dic.First(kvp => kvp.Value == some_value).Key);

但是,当我尝试从 Dictionary 继承一个类时,如下所示,它给了我一个错误。

class Dic : Dictionary<string, string>
{
   public void DoSomething()
   {
      Remove(First(kvp => kvp.Value == some_value).Key);
   }
}

这是我遇到的错误。

顺便说一句,First() 并非来自字典

我尝试实现IEnumerable,但没有帮助

【问题讨论】:

  • dicDoSomething 方法中是什么?
  • 对不起@viveknuna 我已经更正了
  • 根据您的实际用例,从 Dictionary 派生可能不是一个好的决定。更喜欢组合而不是继承,或者使用扩展方法。你看到了吗:stackoverflow.com/questions/1636885/…
  • First()System.Linq.Enumerable static class 中定义的扩展方法。你需要一个using System.Linq; 指令让编译器找到它; Visual Studio 将在需要时建议此修复程序。
  • 只是想指出,您的字典似乎是错误的。如果您经常按值删除,您应该考虑翻转键和值,或者您应该考虑有一对字典(“forward”和“reverse”),所以当你想删除一个正向值 X 时,你在反向的键中查找 X 以获得反向的值 Y,它是正向的键。您,然后根据您现在知道的键从两个字典中删除(使用键 X 从反向删除,使用键 Y 从正向删除)

标签: c# .net


【解决方案1】:

您的 Dic 类不会按原样编译。您可以在课堂上使用this 代替dic

class Dic : Dictionary<string, string>
{
    public void DoSomething()
    {
        Remove(this.First(kvp => kvp.Value == "some_value").Key);
    }
}

然后像这样调用:new Dic().DoSomething();

【讨论】:

  • 谢谢。它停止给我错误。会试试看是否正常
  • 如果你给出原因,这将是一个更好的答案:First() 是一个扩展方法,扩展方法只能在明确指定的实例上调用。因此,这是少数需要使用this 来访问(看似)属于自己的类的方法的情况之一。
  • 感谢@PMF,当机立断。
【解决方案2】:

我之所以继承它是因为我需要重写默认的 Add() 方法来检查 Value 是否已经存在。 ——

这就是 TryAdd 方法(作为 extension methodbaked in 取决于版本)的用途。如果 TryAdd 返回 false,则该值存在;它不会在重复添加时引发错误。您还可以使用 ContainsKey 和 TryGetValue 作为检查键是否存在的替代方法

【讨论】:

  • 感谢您的回答。顺便说一句,我很好奇 C#.NET 中是否有任何数据类型支持具有唯一键和值,并且可以通过使用键或值而不是字典中的键来删除项目?
  • 我想,因为你的字典是一个字符串,你不必配对它;您可以每次添加键和值,任何删除都会检索给定键的值,并将值作为键和键删除。讨论了两种方式的字典,但我不知道是否有一个内在的实现,特别是有一对似乎相当容易实现并且不会导致数据重复,因为它只是索引两个对相同数据的不同引用跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多