【问题标题】:Removing an item in Dictionary using the Value of the item [ not by key ]使用项目的值[不是按键]删除字典中的项目
【发布时间】:2014-12-27 08:34:55
【问题描述】:

我有一个 Dictionary[int,Ibooks],其中 Ibooks 是一个具有 bookname 的界面em>author 作为属性。

我已经厌倦了使用 keyvaluepair 删除字典 item by value

这是我的代码:

 public override void remove()
 {
     Dictionary<int, Ibooks > books = new Dictionary<int, Ibooks>();
     Console.WriteLine("Enter the value to be removed : ");

     string value = Console.ReadLine(); 

     //var item=books.First<kvp.Value == value >;

     foreach (var item in books.Where(kvp => kvp.Value == value).ToDictionary()) //error line
     {
         books.Remove(item);
     }
}

Ibook 界面:

interface Ibooks
    {
        string bookname { get; set; }
        string author { get; set; }
    }

但我收到了这个错误:

“运算符 == 不能应用于 Dictionary.Ibooks 和字符串的类型”

任何人都可以有一个想法来解决这个问题,或者有没有其他更好的方法来通过它的值来找到一个元素? ?

例如,

我的输入是 bookname="dbms" 它应该从字典中删除特定的书。

但我无法与特定值“书名”进行比较。由于该界面同时具有作者和书名作为属性。

【问题讨论】:

  • 你如何比较一个字符串和一个接口,而不是你只需从接口中读取你想要比较的变量的值并检查是否相等
  • books.Where(kvp =&gt; kvp.Value == value) 看起来很奇怪。可能你的意思是这样的books.Where(kvp =&gt; kvp.Value.bookname == value)
  • 接口中的值是字符串,所以我尝试过这样..但是我尝试将它的类型转换为接口它不起作用
  • @Sripremrookie 你能告诉我们你想比较的界面和价值,以便我们可以帮助你
  • 我已经编辑了我的问题。查看界面和我尝试比较的值

标签: c# generics dictionary collections


【解决方案1】:

终于解决了我的问题,

        Console.WriteLine("Enter te bookname");
        string searchvalue=Console.ReadLine ();

        foreach (var item in books.Where(kvp => kvp.Value.bookname == searchvalue ))
        {

            books.Remove(item.Key);

        } 

【讨论】:

    【解决方案2】:

    其他人已经解释了很多不同的方法来做到这一点,但我想在这里记录一下,我认为你从根本上滥用了 Dictionary 对象。字典的大部分概念是通过键添加和引用值。你这样做是完全倒退的,每个人的解决方案都是 80 个字符的 LINQ 查询是有原因的。如果您想以 int(可能是 ISBN?)作为键存储对书籍的引用,请使用该键删除它们。如果您希望用户能够根据书名删除书籍,请使用书名作为键。您现在拥有的东西过于复杂,并且想办法将这种复杂性加倍作为临时解决方案对您毫无帮助。

    【讨论】:

      【解决方案3】:

      试试这个

      foreach (var item in books.Where(kvp => kvp.Value.bookname.equlas(value)).ToDictionary())
          books.Remove(item.Key);
      

      【讨论】:

        【解决方案4】:

        这个说法不正确:

        books.Where(kvp => kvp.Value == value)中的变量项

        您将 IBooks 与导致构建错误的 string 进行比较。

        请注意,该值的类型为string

        字符串值 = Console.ReadLine()

        IBook的字符串属性BookName比较。

        你必须这样做:

        books.Where(kvp => kvp.Value.BookName == value)中的变量项

        【讨论】:

        • 那么我还需要做什么才能与界面中的特定属性进行比较
        • 与特定属性bookname比较
        【解决方案5】:

        你实际上应该使用这样的东西

        foreach (var item in books.Where(kvp => kvp.Value.bookname == value).ToDictionary())
        

        这是因为你试图比较一个接口和字符串(编译器告诉你的)。

        【讨论】:

          【解决方案6】:

          在您的代码中,kvp.Value 指的是 Ibooks 实例。如果您尝试匹配用户输入的书名,请将其更改为 kvp.Value.bookname。如果您要匹配作者,请将其更改为 kvp.Value.author

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-09
            • 1970-01-01
            • 2019-10-03
            • 1970-01-01
            相关资源
            最近更新 更多