我有两个列表,一个来自用户输入,另一个来自数据库。我想检查用户是否输入了数据库列表中已有的字符串,从而从用户输入的列表中删除该字符串。我试过下面的代码
foreach (string name in listOfStudentName)
{
if(_studentsInDatabase.Count > 0)
{
foreach (string nameFromDatabase in _studentsInDatabase)
{
If (name == nameFromDatabase)
{
listOfStudentName.RemoveAll(item => item == name);
break;
}
}
}
}
此代码仅删除两个列表中的第一个元素,然后抛出异常System.InvalidOperationExceptiom: 'Collection was modified; enumeration may not execute.
我应该补充一点,我需要能够在删除每个副本时通知用户,例如一个消息框说" name1被删除"每次重复删除后显示。
答案 0 :(得分:4)
当您在foreach
中枚举项目时,无法从集合中删除项目。
为什么不简单(这一个班轮替换你的整个代码):
listOfStudentName.RemoveAll(_studentsInDatabase.Contains);
如果您需要为数据库中已有的每个用户名执行某些操作:
var alreadyInDatabase = listOfStudentName.Intersect(_studentsInDatabase);
foreach (string username in alreadyInDatabase)
{
Console.WriteLine($"{username} was removed, it is already in the database");
}
var notInDatabase = listOfStudentName.Except(_studentsInDatabase);
listOfStudentName = notInDatabase.ToList();
答案 1 :(得分:1)
为什么使用foreach循环,不需要使用它。只需输入输入的字符串,并使用_studentsInDatabase列表与该字符串匹配。如果匹配输入的字符串,则从listOfStudentName列表中删除最后添加的项目
List<string> listOfStudentName = new List<string>();
List<string> _studentsInDatabase = new List<string>();
listOfStudentName .Add("User 1");
listOfStudentName .Add("User 2");
listOfStudentName .Add("User 3");
listOfStudentName .Add("User 4");
listOfStudentName .Add("User 5");
_studentsInDatabase .Add("User 11");
_studentsInDatabase .Add("User 22");
_studentsInDatabase .Add("User 23");
_studentsInDatabase .Add("User 24");
_studentsInDatabase .Add("User 5");
var index = _studentsInDatabase .FindIndex(x => x == "User 5");
if(index!=-1)
listOfStudentName .RemoveAt(listOfStudentName .Count-1);
或者你可以做一件事,首先匹配输入字符串,如果你发现该字符串进入数据库列表比不需要将其添加到也可以工作的userList