C# 如何使用Tuple列出foreach中的项。按最近的项创建

C# 如何使用Tuple列出foreach中的项。按最近的项创建,c#,asp.net-mvc,C#,Asp.net Mvc,我正在尝试在我正在使用的项目上创建消息传递功能,为此,我在模型中使用foreach循环,以便引入特定用户发送的消息和特定用户接收的消息。我试图让它看起来像一个典型的消息服务,当你输入一条消息时,它会显示你的消息,然后它也会显示你收到的消息,它会按时间顺序显示 我的问题是我不能让它按时间顺序显示消息。foreach正在显示所有消息,但它没有按时间顺序进行部分 下面是我的foreach循环: @{ var user = HttpContext.Current.User.Identity

我正在尝试在我正在使用的项目上创建消息传递功能,为此,我在模型中使用
foreach
循环,以便引入特定用户发送的消息和特定用户接收的消息。我试图让它看起来像一个典型的消息服务,当你输入一条消息时,它会显示你的消息,然后它也会显示你收到的消息,它会按时间顺序显示

我的问题是我不能让它按时间顺序显示消息。foreach正在显示所有消息,但它没有按时间顺序进行部分

下面是我的foreach循环:

  @{
     var user = HttpContext.Current.User.Identity.GetUserId();
     var bob = Model.Chat.Where(u => u.AssignToUserId == user).ToList();
     var sam = Model.Chat.Where(u => u.OwnerUserId == user).ToList();
    }

       @foreach (var message in bob.Zip(sam, Tuple.Create))
                                        {

     <div class="direct-chat-msg">
         <div class="direct-chat-info clearfix">
    <  span class="direct-chat-name pull-left">@message.Item1.OwnerUser.DisplayName</span>
    <span class="direct-chat-timestamp pull-right">@message.Item1.Created</span>
  </div>
      <!-- /.direct-chat-info -->
    <div class="direct-chat-text">
        @message.Item1.Body
    </div>
    <!-- /.direct-chat-text -->
    </div>
    <div class="direct-chat-msg right">
       <div class="direct-chat-info clearfix">
           <span class="direct-chat-name pull-right">@message.Item2.OwnerUser.DisplayName</span>
          <span class="direct-chat-timestamp pull-left">@message.Item2.Created</span>
       </div>
         <!-- /.direct-chat-info -->                                               
      <div class="direct-chat-text">
       @message.Item2.Body
      </div>
        <!-- /.direct-chat-text -->
    </div>
   }
@{
var user=HttpContext.Current.user.Identity.GetUserId();
var bob=Model.Chat.Where(u=>u.AssignToUserId==user.ToList();
var sam=Model.Chat.Where(u=>u.OwnerUserId==user.ToList();
}
@foreach(bob.Zip(sam,Tuple.Create)中的var消息)
{
@message.Item1.OwnerUser.DisplayName
@message.Item1.Created
@message.Item1.Body
@message.Item2.OwnerUser.DisplayName
@message.Item2.Created
@message.Item2.Body
}
这是正在显示的内容:


我试图得到它,使它的订单日期,所以,如果我发送两条信息背靠背,但只收到一个它显示我的两个第一,然后在正确的顺序,而不是每隔一个其他。谢谢

如评论中所述,您可能希望使用
.OrderBy()
来对邮件进行排序,并避免使用
.Zip()
,因为您不能保证始终获得成对的发送方-接收方。您可以获得连续发送或接收的两条或多条消息

您可能需要以某种方式将列表与do某种if语句组合起来,以确定标记。下面的内容应该会让你接近你需要的地方

@{
    var user = HttpContext.Current.User.Identity.GetUserId();
    var bob = Model.Chat.Where(u => u.AssignToUserId == user).ToList();
    var sam = Model.Chat.Where(u => u.OwnerUserId == user).ToList();
    var allMessages = new List<T>();
    allMessages.AddRange(bob).AddRange(sam).OrderBy(x => x.Created);
}

@foreach (var message in allMessages)
{
    @if(message.OwnerUserId == message.OwnerUserId)
    {
        <div class="direct-chat-msg">
            <div class="direct-chat-info clearfix">
                <span class="direct-chat-name pull-left">@message.Item1.OwnerUser.DisplayName</span>
                <span class="direct-chat-timestamp pull-right">@message.Item1.Created</span>
            </div>
            <!-- /.direct-chat-info -->
            <div class="direct-chat-text">
                @message.Item1.Body
            </div>
            <!-- /.direct-chat-text -->
        </div>
    }
    else
    {
        <div class="direct-chat-msg right">
            <div class="direct-chat-info clearfix">
                <span class="direct-chat-name pull-right">@message.Item2.OwnerUser.DisplayName</span>
                <span class="direct-chat-timestamp pull-left">@message.Item2.Created</span>
            </div>
            <!-- /.direct-chat-info -->                                               
            <div class="direct-chat-text">
                @message.Item2.Body
            </div>
            <!-- /.direct-chat-text -->
        </div>
    }
}
@{
var user=HttpContext.Current.user.Identity.GetUserId();
var bob=Model.Chat.Where(u=>u.AssignToUserId==user.ToList();
var sam=Model.Chat.Where(u=>u.OwnerUserId==user.ToList();
var allMessages=new List();
allMessages.AddRange(bob).AddRange(sam).OrderBy(x=>x.Created);
}
@foreach(所有消息中的var消息)
{
@if(message.OwnerUserId==message.OwnerUserId)
{
@message.Item1.OwnerUser.DisplayName
@message.Item1.Created
@message.Item1.Body
}
其他的
{
@message.Item2.OwnerUser.DisplayName
@message.Item2.Created
@message.Item2.Body
}
}

p.S.是在记事本++中这样做的,因此我的标记可能不正确。

如评论中所述,您可能希望使用
.OrderBy()
来对邮件进行排序,并避免使用
.Zip()
,因为您无法保证始终会获得成对的发送方-接收方。您可以获得连续发送或接收的两条或多条消息

您可能需要以某种方式将列表与do某种if语句组合起来,以确定标记。下面的内容应该会让你接近你需要的地方

@{
    var user = HttpContext.Current.User.Identity.GetUserId();
    var bob = Model.Chat.Where(u => u.AssignToUserId == user).ToList();
    var sam = Model.Chat.Where(u => u.OwnerUserId == user).ToList();
    var allMessages = new List<T>();
    allMessages.AddRange(bob).AddRange(sam).OrderBy(x => x.Created);
}

@foreach (var message in allMessages)
{
    @if(message.OwnerUserId == message.OwnerUserId)
    {
        <div class="direct-chat-msg">
            <div class="direct-chat-info clearfix">
                <span class="direct-chat-name pull-left">@message.Item1.OwnerUser.DisplayName</span>
                <span class="direct-chat-timestamp pull-right">@message.Item1.Created</span>
            </div>
            <!-- /.direct-chat-info -->
            <div class="direct-chat-text">
                @message.Item1.Body
            </div>
            <!-- /.direct-chat-text -->
        </div>
    }
    else
    {
        <div class="direct-chat-msg right">
            <div class="direct-chat-info clearfix">
                <span class="direct-chat-name pull-right">@message.Item2.OwnerUser.DisplayName</span>
                <span class="direct-chat-timestamp pull-left">@message.Item2.Created</span>
            </div>
            <!-- /.direct-chat-info -->                                               
            <div class="direct-chat-text">
                @message.Item2.Body
            </div>
            <!-- /.direct-chat-text -->
        </div>
    }
}
@{
var user=HttpContext.Current.user.Identity.GetUserId();
var bob=Model.Chat.Where(u=>u.AssignToUserId==user.ToList();
var sam=Model.Chat.Where(u=>u.OwnerUserId==user.ToList();
var allMessages=new List();
allMessages.AddRange(bob).AddRange(sam).OrderBy(x=>x.Created);
}
@foreach(所有消息中的var消息)
{
@if(message.OwnerUserId==message.OwnerUserId)
{
@message.Item1.OwnerUser.DisplayName
@message.Item1.Created
@message.Item1.Body
}
其他的
{
@message.Item2.OwnerUser.DisplayName
@message.Item2.Created
@message.Item2.Body
}
}

p.S.是在记事本++中这样做的,所以我的标记可能不正确。

你是说你熟悉
.Zip()
,但不熟悉
.OrderBy()
?我才不信呢。看来你是想把这两张单子连在一起,然后再订购,而不是拉上拉链。例如,如果每个列表中没有相同的号码,Zip将不会返回所有邮件。其次,在收到响应之前,我可以在一行中键入多条消息,因此压缩在这里似乎没有意义。您是说您熟悉
.Zip()
,但不熟悉
.OrderBy()
?我才不信呢。看来你是想把这两张单子连在一起,然后再订购,而不是拉上拉链。例如,如果每个列表中没有相同的号码,Zip将不会返回所有邮件。第二,在收到回复之前,我可以在一行中输入多条消息,所以压缩在这里似乎没有意义。你在回答我时帮了我很大的忙。我只是需要稍微调整一下才能让它工作,但你让我走上了正确的道路。我必须将所有内容都放在一个变量中,使var bob=同时包含owneruserid和assigntouserid,然后将其放入一个列表中以包含bob。再次感谢你的帮助!你对我的回答非常有帮助。我只需要稍微调整一下就可以了