Foreach通过列表 - 重复

时间:2013-05-07 18:37:12

标签: c# asp.net-mvc-4

这似乎是一个基本问题,然而,我似乎无法弄清楚我做错了什么。我有一个'FavouritePost'列表,其中包含'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数量,但是,我认为条件语句会阻止替代图像显示。对于冗长的问题道歉,我只是认为这会让我更容易理解我的困境。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

你应该沿着这些方向做点什么:

@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中的每个帖子,看它是否匹配,并每次输出信息。要知道你的真实含义是不够聪明的,只是做你所说的。类似于以下代码如何编写2个nopes和yep:

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");
   }
}

答案 1 :(得分:0)

怎么样:

@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列表中是否有条目。如果它有一个条目输出最喜欢的图像,而不是Notfavourite图像。