如何使用LINQ对两个可能字段之一进行分组?

Dar*_*oki 5 c# linq group-by

我正在尝试获取与给定用户的最新联系,按用户分组:

public class ChatMessage
{
    public string SentTo { get; set; }
    public string SentFrom { get; set; }
    public string MessageBody { get; set; }
    public string SendDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用户的联系信息可以是SentToSentFrom.

List<ChatMessage> ecml = new List<ChatMessage>();
var q = ecml.OrderByDescending(m => m.SendDate).First();
Run Code Online (Sandbox Code Playgroud)

会给我最新的消息,但我需要每个用户的最后一条消息.我能找到的最接近的解决方案是LINQ Max Date with group by,但我似乎无法找出正确的语法.如果我不需要,我宁愿不创建多个List对象.如果用户的信息在SentTo,我的信息将在SentFrom,反之亦然,所以我确实有一些方法来检查用户的数据在哪里.

我提到过我对LINQ很新吗?任何帮助将不胜感激.

das*_*ght 3

由于您需要将每条记录解释两次 - 即解释为 aSentTo和 a SentFrom,因此查询变得有点棘手:

var res = ecml
    .SelectMany(m => new[] {
        new { User = m.SentFrom, m.SendDate }
    ,   new { User = m.SentTo, m.SendDate }
    })
    .GroupBy(p => p.User)
    .Select(g => new {
        User = g.Key
    ,   Last = g.OrderByDescending(m => m.SendDate).First()
    });
Run Code Online (Sandbox Code Playgroud)

关键技巧在于SelectMany,它将每个项目分成两个匿名项目 - 一个将用户与ChatMessage配对,另一个将用户与相同日期配对。SentFromSendDateSentTo

一旦您将两条记录都放入可枚举中,剩下的事情就很简单:按用户分组,然后将帖子中的查询应用到每个组。