遍历一个列表——重复项

本文关键字:列表 一个 遍历 | 更新日期: 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图像。