遍历一个列表——重复项
本文关键字:列表 一个 遍历 | 更新日期: 2023-09-27 18:12:35
这似乎是一个基本的问题,然而,我似乎不能弄清楚我做错了什么。我有一个' favoritepost '列表,其中包含'FavId', UserId和PostId。这个类用于确定用户是否已将帖子添加到"收藏"列表中。在我的控制器中,我过滤掉了帖子,只选择与当前userId匹配的帖子。在我看来,我有以下foreach循环:
@foreach (var fav in Model.FavPosts)
{
if (post.PostId == fav.PostId)
{
<img src="@Url.Content("~/Content/images/favourite_img.jpg")" alt="" />
}
else if (post.PostId != fav.PostId)
{
<img src="@Url.Content("~/Content/images/Notfavourite_img.jpg")" alt="" />
}
}
我的问题是:当foreach循环运行时,它根据用户是否"喜欢"该帖子,在帖子旁边显示一个图像。但是,当我运行以下代码时,它会在帖子旁边分配多个图像。例如,根据下面的表数据:
FavId UserId PostId
1 1 1
2 1 2
3 1 4
UserId = 1,点赞了三个帖子(1,2,4),然而,UserId = 1没有点赞过帖子3
然而,当我运行我的页面时,对于第一篇文章,显示了3张图片。
Post 1 = "Liked Image", "Not Liked Image", "Not Liked Image"
Post 2 = "Not Liked Image", "Liked Image", "Not Liked Image"
Post 2 = "Not Liked Image", "Not Liked Image", "Liked Image"
它似乎迭代了三次,并为帖子分配了三张图片,而不是一张图片。我意识到这是因为列表中UserId的数量,然而,我认为条件语句会阻止替代图像显示。我为这个冗长的问题道歉,我只是想这样能让你更容易理解我的困境。任何帮助都太好了。
您应该按照这些行做一些事情:
@if (Model.FavPosts.Any(x => x.PostId == post.PostId))
// show favourite icon
else
// show not favourite icon
或者,如果您的Post
类上的相等性是使用PostId
定义的,那么可以这样做(可以说)提高可读性:
@if (Model.FavPosts.Contains(post))
// show favourite icon
else
// show not favourite icon
你现在正在做的是检查FavPost
中的每个帖子,看看它是否匹配,并每次输出信息。它还没有聪明到知道你真正的意思,它只是按照你说的去做。类似于下面的代码如何写两个nopes和一个yes:
int[] favorites = { 1, 2, 3 };
int thisOne = 3;
foreach (var fav in favorites)
{
if (thisOne == fav)
{
Console.WriteLine("yep");
}
else if (thisOne != fav)
{
Console.WriteLine("nope");
}
}
如何:
@if(Model.FavPosts.Where(f => post.PostId == f.PostId).Any())
{
<img src="@Url.Content("~/Content/images/favourite_img.jpg")" alt="" />
}
else
{
<img src="@Url.Content("~/Content/images/Notfavourite_img.jpg")" alt="" />
}
如果我理解正确的话,你想检查一个帖子是否在FavPost列表中有一个条目。如果它有一个条目输出最喜欢的图像,而不是notfavorite图像。