2016-07-26 138 views
1

我有名单如下分配给该列表例如如何采取最后一个记录从列表

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()属性?或者任何形式的帮助将不胜感激。谢谢你的时间。

+1

如果你不想被那你怎么解决的最后五个条目使用顺序?通过入境时间或其他东西? –

+1

[使用Linq获取集合的最后N个元素?](http://stackoverflow.com/questions/3453274/using-linq-to-get-the-last-n-elements-of-a收集) –

回答

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); 
+0

感谢您的回答,正是我所需要的.P1努力 –

+1

@SuhailMumtazAwan检查我更新的答案。我认为如果你为此使用更多的LINQ可能会更简单。 –

+0

@ S.Akbari我亲自链接到https://morelinq.github.io,而不是google项目页面。另外,TakeLast使用队列来颠倒顺序。不知道这是多么有效,我不擅长大O符号。 =) –

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(); 
+2

这是一条评论 – mybirthname

+0

感谢您的回答,但正如我已经表明,我不想使用orderby子句。 –

+1

我错过了评论。如果你只是想添加最后5个,那么就去S.Akbari的答案,这里也包括在内http://stackoverflow.com/questions/3453274/using-linq-to-get-the-last-n-elements-of -a-集合 –

1

你可以使用Reverse(),这是稍微反常。

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

感谢您的回答,但这不fullfil needs.P1的努力 –

+0

我很好奇 - 它怎么不满足您的需要?我个人会和S. Akbari的答案一起去,我只是提供另一种选择。 =) –

+0

是的,我知道,我已经使用reverse()。 –

0

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

var lastRecords= CurrentMessage.OrderByDescending(i=>i.Id).Where(p=>p.GroupName==groupName).Take(5).ToList(); 
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?

相关问题