我在使代码工作时遇到了一些麻烦。我正在使用LINQ to SQL从我的数据库中检索所有我的actor对象,这些对象是某个电影的演员。我检查了输出,他们很好。
因为我必须使用字典来显示演员姓名作为一个整体,我需要比较列表框的选定值是否与演员的First-和LastName的组合相同。
我要做的第一件事就是浏览列表框中的所有选定项目。接下来,我想将它们与使用LINQ检索的actorsm的First和LastName进行比较。但它并不像我想要的那样有效。
示例:电影是低俗小说,与电影有关的演员是乌玛瑟曼,塞缪尔杰克逊和约翰特拉沃尔塔。当我运行此代码时,我总共得到3个MessageBoxes,其输出如下:
虽然我真正想要实现的是它在找到Uma之后突破了循环,然后得到一个消息框说:
[5,Samuel L. Jackson]与Samuel L. Jackson比赛。等等。我想这样做,因为我想删除和/或插入从电影中选择/取消选择的演员。
var deleteMovieActors = db.MovieActors.Where(mid => mid.Movie_MovieId == MovieId).Select(a => a.Actor);
foreach (var item in lstbActors.SelectedItems)
{
foreach (Actor a in deleteMovieActors)
{
if (lstbActors.SelectedItem.ToString().Contains(a.FirstName + " " + a.LastName))
{
MessageBox.Show(item.ToString() + " Matches " + a.FirstName + " " + a.LastName);
break;
}
}
}
以下是我创建列表框的方法:
private void InitializeListBox()
{
var actors = new Dictionary<int, string>();
foreach (var actor in db.Actors.ToList())
{
actors.Add(actor.ActorId, actor.FirstName + " " + actor.LastName);
}
lstbActors.DataSource = actors.ToList();
lstbActors.ValueMember = "Key";
lstbActors.DisplayMember = "Value";
lstbActors.SelectedIndex = -1;
// Get Actors by MovieId
var MAct = from ma in db.MovieActors
where ma.Movie_MovieId == MovieId
select ma;
List<Actor> act = new List<Actor>();
foreach (var ma in MAct)
{
act.Add(db.Actors.Where(a => a.ActorId == ma.Actor_ActorId).Single());
}
foreach (Actor a in act)
{
int index = lstbActors.FindStringExact(a.FirstName + " " + a.LastName);
if (index != -1)
{
lstbActors.SetSelected(index, true);
}
}
}
答案 0 :(得分:0)
问题出在IF语句的条件中。 SelectedItem属性在循环中反复出现第一次出现。
if (lstbActors.SelectedItem.ToString().Contains(a.FirstName + " " + a.LastName))
{
MessageBox.Show(item.ToString() + " Matches " + a.FirstName + " " + a.LastName);
break;
}
当我按如下方式更改代码时,它可以正常工作:
item.ToString().Contains(a.FirstName + " " + a.LastName
答案 1 :(得分:0)
如果你想要First和Last Name的完全匹配,请使用string.Equals()而不是contains,因为contains返回包含指定关键字的所有字符串,例如,如果你对字符串“Hello”使用contains for Hello“ “Hello World”,然后它会给你Hello和Hello World。