在此代码中,当我添加2本书并尝试删除第1和第2本书时,第1本书被删除,第2本书没有删除。在下一种情况下,当我添加3本书并逐一删除时,1删除,2删除,第3次删除,当我删除2时。当我添加4本书2和4未删除时。
我的代码(我是一名受训者,所以我是C#的初学者)
$sq4 = "SELECT * FROM opportunities WHERE skill1 = '$skill'";
$result4 = mysqli_query($conn, $sq4);
while($row4 = mysqli_fetch_assoc($result4))
{$id4=$row4['id'];
echo $id4 . "is the ID of the Job opening matching the skill you entered as the most important skill<br>";
$job[$i]= $row4['id'];
$job[$i][1] = 3;
$i=$i+1;}
答案 0 :(得分:0)
问题在于,当您移除图书时,您的图书清单正在重新排序,因此图书ID不再反映您添加图书时所处的位置。 例如。你的bookList有2本书(bookList [0]和bookList [1])。当您删除1本书时,您将获得booklist [0],因此当您尝试删除下一本书时(使用您的代码表示您使用del -1来获取该位置),您将尝试从您的数组中删除bookList [1]当然不存在。
答案 1 :(得分:0)
您应该使用books
或更具体地通过对象的唯一ID删除bookId
。您发布的代码正在使用书籍的位置将其从列表中删除。拥有bookId
的唯一目的是从任意数量的books
中识别该图书,然后使用代码快速操作它。
让我告诉你一些关于面向对象编程(OOP)的内容,它将以某种方式帮助你。每个对象都有三个功能:
在这里,Identity(可以用来选择它的bookId
之类的独特之处)是您应该用来操纵对象(书籍)的东西,而不是对象的位置。
足够的理论,在你的代码中
bookList.RemoveAt(Del - 1);
是罪魁祸首。将其更改为bookId
,您的问题将得到解决。
由于
答案 2 :(得分:0)
在您的代码中,您混合了List
和Array
数据结构。让我们仔细看看:
if (bookList.Exists(x => x.bookId == Del))
在这里,您使用图书清单中的迭代搜索来查找图书。首先,你可以通过引入额外的字典来更快地完成它,那么你的程序会更快。其次是在此之后,你得到了本书的id
,并删除了之前的书,因为它不是列表,而是数组:
bookList.RemoveAt(Del - 1);
为什么这不能按预期工作?这很简单,假设您已经添加了三本书,而且您的列表看起来像(这里的箭头是列表中书籍之间的链接):
1 --> 2 --> 3
删除第二本书后,您的列表如下:
1 --> 3
如果你添加另一本书,它的id将等于3
!因为这一行(bookList.Count
等于2):
Console.WriteLine("Book Id:{0}", book.bookId = bookList.Count + 1);
所以你的清单看起来像这样:
1 --> 3 --> 3
因此,您必须为书籍的唯一身份识别维护额外的计数器。另一件事是您必须学习可以使用的其他LINQ方法,例如RemoveAll
以便从列表中轻松删除,Find
以便于搜索列表,等等。您可以找到有关LINQ here的一些建议。
答案 3 :(得分:0)
问题是书籍id的不稳定。列表中应该是唯一的,以识别正确的书。
这是快速修复。
在项目中添加Linq名称空间:
using System.Linq;
修改GetBook()方法,使用列表
中的最大图书ID号生成唯一的bookIdvar bookId = bookList.Count> 0 ? bookList.Max(b => b.bookId) : 0;
Console.WriteLine("Book Id:{0}", book.bookId = bookId + 1);