如何从列表中获取最后的记录

时间:2016-07-26 10:55:22

标签: c# entity-framework linq

我的列表如下

static List<MessageDetail> CurrentMessage = new List<MessageDetail>();

动态地,分配给此列表的值,例如:

CurrentMessage.Add(new MessageDetail { UserName = 123,GroupName = somegrp, Message = somemsg });

在这里,我想拍摄最后5张唱片。

// this returns first 5 result, dont want to user orderby clause either
CurrentMessagesForGroup = CurrentMessage
                          .Where(c => c.GroupName == groupName)
                          .Take(5).ToList();

有没有办法实现TakeLast()属性?或者任何形式的帮助将不胜感激。谢谢你的时间。

7 个答案:

答案 0 :(得分:3)

使用OrderBy(ASC或DESC)为Take操作正确排列记录。

<强>升序:

CurrentMessagesForGroup = CurrentMessage
                        .Where(c => c.GroupName == groupName)
                        .OrderBy(c => c.GroupName)
                        .Take(5)
                        .ToList();

或降序:

CurrentMessagesForGroup = CurrentMessage
                        .Where(c => c.GroupName == groupName)
                        .OrderByDescending(c => c.GroupName)
                        .Take(5)
                        .ToList();

答案 1 :(得分:2)

使用skip

CurrentMessagesForGroup = CurrentMessage
                    .Where(c => c.GroupName == groupName).Skip(Math.Max(0, CurrentMessage.Count() - 5)).ToList();

编辑:我也发现我觉得使用它更容易(MoreLinq):

using MoreLinq;

var CurrentMessagesForGroup2 = CurrentMessage.TakeLast(5);

答案 2 :(得分:1)

您可以使用Reverse(),这有点不正常。

CurrentMessagesForGroup = CurrentMessage
                    .Where(c => c.GroupName == groupName)
                    .Reverse()
                    .Take(5).ToList();

答案 3 :(得分:1)

我为此使用了扩展方法。

public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int numElements)
{
    return source.Skip(Math.Max(0, source.Count() - numElements));
}

使用它:

CurrentMessagesForGroup = CurrentMessage.Where(c => c.GroupName == groupName).TakeLast(5).ToList();

修改:归功于Using Linq to get the last N elements of a collection?

答案 4 :(得分:1)

我喜欢这种实现,它使用了循环缓冲区。

map

答案 5 :(得分:1)

如果任何人使用DotNet Core 2或更高版本或DotNet Standard 2.1或更高版本,则可以使用Linq内置的.TakeLast()

参考:Microsoft Documentation here

答案 6 :(得分:0)

如果MessageDetails类具有数字ID或创建日期时间,我们可以使用

var lastRecords= CurrentMessage.OrderByDescending(i=>i.Id).Where(p=>p.GroupName==groupName).Take(5).ToList();