按时间打印两份型号列表

本文关键字:两份 列表 时间 打印 | 更新日期: 2023-09-27 18:18:07

我有2个在控制器中初始化的模型类型列表,并在其中插入值,然后将这些列表对象分配给Viewdata,以便我可以使用forach迭代此列表。但问题是,这两个列表的模型有属性时间,所以我想打印这两个列表顺序的时间。这是我的代码。

List1的模型:

public class Likes
{
    public string UserName { get; set; }
    public string UserPhoto { get; set; }
    public int UserId { get; set; }
    public string Posttext { get; set; }
    public int? PId { get; set; }
    public DateTime? Liketime { get; set; }
}

List2的模型:

public class Comments
{
    public string UserName { get; set; }
    public string UserPhoto { get; set; }
    public int UserId { get; set; }
    public string CommentText { get; set; }
    public int? PId { get; set; }
    public DateTime? Commenttime { get; set; }
}

控制器:

public ActionResult Home()
{   
    List<Likes> List = new List<Likes>();
    var f = (from n in _db.PostLikes where n.ToWhomId == CurrentUser.User.Id join o in _db.Users on n.UserId equals o.Id join p in _db.Posts on n.PostId equals p.Id   select new { Name = o.UserName, Photo = o.UserPhoto, ID = n.UserId, PID = n.PostId ,p.PostText,n.Time }).ToList().OrderByDescending(n=>n.Time);
    foreach (var item in f)
    {
        Likes mylikes = new Likes()
        {
            PId = item.PID,
            UserName = item.Name,
            UserPhoto = item.Photo,
            Posttext=item.PostText,
            Liketime=item.Time
        };
        List.Add(mylikes);
    }
    ViewData["likes"] = List;
    List<Comments> List2 = new List<Comments>();
    var qw = (from n in _db.PostComments where n.ToWhomId == CurrentUser.User.Id join o in _db.Users on n.UserId equals o.Id join p in _db.Posts on n.PostId equals p.Id select new { Name = o.UserName, Photo = o.UserPhoto, ID = n.UserId, PID = n.PostId, p.PostText, n.Time, Comment = n.Comments }).ToList().OrderByDescending(n => n.ID);
    foreach (var item in qw)
    {
        Comments mycomments = new Comments()
        {
            PId = item.PID,
            UserName = item.Name,
            UserPhoto = item.Photo,
            CommentText = item.PostText,
            Commenttime = item.Time
        };
        List2.Add(mycomments);
    }
    ViewData["comments"] = List2;
    return View(posts);
}

视图:

foreach (var item in (dynamic)ViewData["likes"])
{
    if (item.Posttext == null)
    {
        var trim = item.Posttext.Substring(0, 5) + "...";
        item.Posttext = "";
    }
    else
    {
        var trim = item.Posttext + " ";
        item.Posttext = trim;
    }
    <li>
        <a href="~/Profile/Index">
            <img class="img-responsive center-block" src="~/Images/@item.UserPhoto" width="40" height="40" />
            <p style="color:black"><b>@item.UserName</b> liked your post @item.Posttext </p>
           <img width="16" height="16" src="@Url.Content("~/Images/like-128.png")" />
           <span style="color:black"> @item.Liketime</span>
        </a>
    </li>
}
foreach (var item in (dynamic)ViewData["comments"])
{
    // trim here
    <li>
        <a href="~/Profile/Index">
            <img class="img-responsive center-block" src="~/Images/@item.UserPhoto" width="40" height="40" />
            <p style="color:black"><b>@item.UserName</b> commented on your post </p>
            <img width="16" height="16" src="@Url.Content("~/Images/Custom-Icon-Design-Flatastic-1-Comment (1).ico")" />
            <span style="color:black"> @item.Commenttime</span>
        </a>
    </li>
}

但是我不想在List1之后打印List2。我想通过Time打印它们,如果list1模型首先插入,它应该打印,如果list2,它应该打印直到两个列表的末尾。

按时间打印两份型号列表

如果您想在一个列表中显示LikesComments,按Time排序,然后创建一个视图模型,以便您可以将查询投影到该视图模型,将它们连接到一个集合,然后按Time排序。

基于您所显示的视图,您的视图模型将是

public class ResponseVM
{
    public string Name { get; set; }
    public string Photo { get; set; }
    public string Message { get; set; }
    public string Image { get; set; }
    [DisplayFormat(DataFormatString = "{0:...}")] // your format
    public DateTime Time { get; set; }
}

假设您的显示与父模型(例如Post)相关联,那么您还将拥有

public class PostVM
{
    .... // properties of Post needed for the view
    public IEnumerable<ResponseVM> Responses { get; set; }
}

GET方法将是

var likes = (from n in _db.PostLikes where ....).ToList().Select(x => new ResponseVM()
{
    Name = x.Name,
    Photo = Url.Content(String.Format("~/Images/{0}", x.Photo)),
    Message = String.Format(" liked your post {0}", x.PostText), // see notes below
    Image = Url.Content("~/Images/like-128.png"),
    Time = x.Time
});
var comments = (from n in _db.PostComments where ...).ToList().Select(x => new ResponseVM()
{
    .... // as above except adjust Message and Image properties
});
// Combine and order
var responses = likes.Concat(comments).OrderBy(x => x.Time);
PostVM model = new PostVM()
{
    ....
    Responses = responses
};
return View(model);

视图将是

@model PostVM
....
<ul>
    @foreach(var response in Model.Responses)
    {
        <li>
            <a href="~/Profile/Index">
                <img class="img-responsive center-block" src="@response.Photo" width="40" height="40" />
                <p style="color:black"><b>@item.Name</b>@response.Message</p>
                <img width="16" height="16" src="@reponse.Image" />
                <span style="color:black">@Html.DisplayFor(m => response.Time</span>
            </a>
        </li>
    }
</ul>

旁注:它不清楚你试图做你的'修剪'代码在你的视图。在if块中,您设置了一个变量var trim = ...,但从不使用它,然后将Posttext设置为一个无意义的空字符串。在else块中,您似乎只是在末尾添加不必要的空间。在任何情况下,这种类型的代码属于控制器,而不是视图。

所以你基本上想要同时运行两个数组并选择比另一个时间更短的对象。所以你总是需要每个数组的当前索引,就是这样。

有两种方法:

1)假设您已经订购了 &准备了2个清单,其中一个是Comments &喜欢之一。您将获取最早的评论/点赞并将其添加到结果列表:

List<Comments> lComments = someList.OrderBy(a => a.Commenttime);
List<Likes> lLikes = someList2.OrderBy(a => a.Liketime);
List<object> lResults = new List<object>();
int iComment = 0, iLike = 0;
for(int i = 0; i < lComments.Count() + lLikes.Count(); i++)
{
    if(lComments.Count() >= iComment) //set Like
    {
        lResults.Add(lLikes[iLike++]);
        continue;
    }
    if(lLikes.Count() >= iLike ) //set Comment
    {
        lResults.Add(lComments[iComment++]);
        continue;
    }
    if(lLikes[iLike].Liketime > lComments[iComment].Commenttime)
        lResults.Add(lComments[iComment++]);
    else
        lResults.Add(lLikes[iLike++]);
}

2)另一种方法是使它更"专业"的方式,你将使用IComparable<T>接口,其中喜欢&评论之间可以比较。该接口的实现将允许您轻松地对这些元素进行排序。所以我们把所有的对象从评论到喜欢放到1 list/array,然后排序:

public class Likes : IComparable<T>
{
    //previous implementation...
    public int CompareTo(object obj)
    {
        if(obj is Comments)
            return this.Liketime.CompareTo((obj as Comments).Commenttime);
        if(obj is Likes)
            return this.Liketime.CompareTo((obj as Likes).Liketime);
        throw new NotSupportedException();
    }
}
public class Comments: IComparable<T>
{
    //previous implementation...
    public int CompareTo(object obj)
    {
        if(obj is Comments)
            return this.Commenttime.CompareTo((obj as Comments).Commenttime);
        if(obj is Likes)
            return this.Commenttime.CompareTo((obj as Likes).Liketime);
        throw new NotSupportedException();
    }
}
// And now You just need to use them to sort:
List<Comments> lComments = someList.OrderBy(a => a.Commenttime);
List<Likes> lLikes = someList2.OrderBy(a => a.Liketime);
List<object> lResults = new List<object>(lComments);
lResults.AddRange(lLikes);
lResults.Sort();

请注意,我已经提交了所有的安全检查(空引用检查)等。