我的列表如下
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()
属性?或者任何形式的帮助将不胜感激。谢谢你的时间。
答案 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()
答案 6 :(得分:0)
如果MessageDetails类具有数字ID或创建日期时间,我们可以使用
var lastRecords= CurrentMessage.OrderByDescending(i=>i.Id).Where(p=>p.GroupName==groupName).Take(5).ToList();