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

C# 如何使用LINQ对两个可能的字段之一进行分组?,c#,linq,group-by,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; } } 用户的联系信息可以是SentTo或SentFrom List

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

public class ChatMessage
{
    public string SentTo { get; set; }
    public string SentFrom { get; set; }
    public string MessageBody { get; set; }
    public string SendDate { get; set; }
}
用户的联系信息可以是
SentTo
SentFrom

List<ChatMessage> ecml = new List<ChatMessage>();
var q = ecml.OrderByDescending(m => m.SendDate).First();
List ecml=new List();
var q=ecml.OrderByDescending(m=>m.SendDate).First();
将给我最新的消息,但我需要每个用户的最后一条消息。 我能找到的最接近的解决方案是,但我似乎无法找出正确的语法。如果不需要,我宁愿不创建多个列表对象。 如果用户的信息在
SentTo
中,我的信息将在
SentFrom
中,反之亦然,因此我确实有办法检查用户数据的位置


我有没有提到我对LINQ很陌生?非常感谢您的帮助。

这应该很简单,请看以下代码:

string username = "John";
var q = ecml.Where(i=>i.SentFrom == username || i.SentTo == username).OrderByDescending(m => m.SendDate).First();

它只需过滤您的集合,即选择SentFrom或SentTo等于
用户名

的项目,因为您需要对每条记录解释两次,即作为
SentTo
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()
    });
关键技巧在于
SelectMany
,它将每个
ChatMessage
项目分成两个匿名项目——一个将
SentFrom
用户与
SendDate
用户配对,另一个将
SentTo
用户与同一日期配对


一旦您在一个可枚举列表中有了这两个记录,剩下的就很简单了:您按用户分组,然后将帖子中的查询应用于每个组。

GroupBy
user,然后
。选择(g=>g.OrderByDescending(m=>m.SendDate)。First()
您始终可以进行两个单独的查询,第一个是用户在SentTo中,第二个是用户在SentFrom中,然后从这两个查询中选择一个进行max查询。感谢您的回复,但是您如何在同一语句中按SentTo或SentFrom分组?是否有可能,或者我需要复制列表并修改它以合并字段,然后对新列表进行分组?这是没有回答OP的问题