使用项目的值[不按键]删除词典中的项目

时间:2014-10-31 04:36:05

标签: c# generics dictionary collections

我有一个词典[int,Ibooks] ,其中 Ibooks 是一个 bookname 作者 作为属性。

我已经厌倦了使用 keyvaluepair 删除字典 项目的值

这是我的代码:

 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; }
    }

但我收到了这个错误:

“operator ==无法应用于Dictionary.Ibooks和字符串的类型”

任何人都有想法解决这个问题,否则还有其他更好的方法来找到一个元素的价值吗? ?

例如,

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

但我无法与特定值“bookname”进行比较。由于接口具有author和bookname作为属性。

6 个答案:

答案 0 :(得分:1)

此陈述不正确:

  book中的

var item.Where(kvp =&gt; kvp.Value == value)

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

请注意,该值的类型为string

  
    

string value = Console.ReadLine()

  

BookName的字符串属性IBook进行比较。

你必须做这样的事情:

  
    
      book中的

var item.Where(kvp =&gt; kvp.Value.BookName == value)

    
  

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

试试这个

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

答案 5 :(得分:0)

最后这解决了我的问题,

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

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

            books.Remove(item.Key);

        }