我有一个词典[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作为属性。
答案 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);
}