Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从列表中获取最后的记录_C#_Entity Framework_Linq - Fatal编程技术网

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

C# 如何从列表中获取最后的记录,c#,entity-framework,linq,C#,Entity Framework,Linq,我的清单如下 static List<MessageDetail> CurrentMessage = new List<MessageDetail>(); 这里,我想拍最后5张左右的唱片 // this returns first 5 result, dont want to user orderby clause either CurrentMessagesForGroup = CurrentMessage .Whe

我的清单如下

static List<MessageDetail> CurrentMessage = new List<MessageDetail>();
这里,我想拍最后5张左右的唱片

// this returns first 5 result, dont want to user orderby clause either
CurrentMessagesForGroup = CurrentMessage
                          .Where(c => c.GroupName == groupName)
                          .Take(5).ToList();
有没有办法实现
TakeLast()
属性?否则,任何形式的帮助都将不胜感激。感谢您的时间。

使用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();
使用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();
使用:

编辑:我还发现它更易于使用():

使用:

编辑:我还发现它更易于使用():

你可以使用,这有点反常

CurrentMessagesForGroup = CurrentMessage
                    .Where(c => c.GroupName == groupName)
                    .Reverse()
                    .Take(5).ToList();
你可以使用,这有点反常

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

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

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

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

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

我使用扩展方法来实现这一点

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

编辑:归功于

我为此使用扩展方法

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

编辑:我喜欢这个实现,它使用循环缓冲区

public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> input, int n)
{
    if (n == 0)
        yield break;

    int tail = 0;
    int head = 0;
    int count = 0;

    T[] buffer = new T[n];

    foreach (T item in input)
    {
        buffer[tail] = item;

        tail = (tail + 1) % n;

        if (count < n)
            count++;
        else
            head = (head + 1) % n;
    }

    for (int i = 0; i < count; i++)
        yield return buffer[(head + i) % n];
}
公共静态IEnumerable TakeLast(此IEnumerable输入,int n)
{
如果(n==0)
屈服断裂;
int-tail=0;
int头=0;
整数计数=0;
T[]缓冲区=新的T[n];
foreach(输入中的T项)
{
缓冲区[尾]=项目;
尾=(尾+1)%n;
如果(计数
我喜欢这个实现,它使用循环缓冲区

public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> input, int n)
{
    if (n == 0)
        yield break;

    int tail = 0;
    int head = 0;
    int count = 0;

    T[] buffer = new T[n];

    foreach (T item in input)
    {
        buffer[tail] = item;

        tail = (tail + 1) % n;

        if (count < n)
            count++;
        else
            head = (head + 1) % n;
    }

    for (int i = 0; i < count; i++)
        yield return buffer[(head + i) % n];
}
公共静态IEnumerable TakeLast(此IEnumerable输入,int n)
{
如果(n==0)
屈服断裂;
int-tail=0;
int头=0;
整数计数=0;
T[]缓冲区=新的T[n];
foreach(输入中的T项)
{
缓冲区[尾]=项目;
尾=(尾+1)%n;
如果(计数
如果有人使用DotNet Core 2或更高版本或DotNet Standard 2.1或更高版本,则可以使用Linq的内置
.TakeLast()


参考资料:

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



参考资料:

如果您不想使用order,那么如何修复最后五个条目??按输入时间或其他方式?如果您不想使用order,那么如何修复最后五个输入??通过输入时间或其他方式?可能重复感谢您的回答,但正如我已经说过的,我不想使用orderby子句。我在评论中遗漏了这一点。如果您只想添加最后5个,那么请使用S.Akbari的答案,也包括在这里。谢谢您的回答,但正如我已经说过的,我不想使用orderby子句。我在评论中遗漏了这一点。如果你只想增加最后5个,那么就用S.Akbari的答案,这里也包括了,谢谢你的回答,但这并不能满足你的需要。P1对于effort我很好奇-它怎么不能满足你的需要?我个人赞同S.Akbari的回答,我只是提供了另一个选择谢谢你的回答,但这并不能满足你的需要。我很好奇,它怎么不能满足你的需要呢?我个人赞同S.Akbari的回答,我只是提供了另一个选择谢谢你的回答,正是我所需要的effort@SuhailMumtazAwan检查我的最新答案。我认为如果你使用moreLINQ来实现这个目的,它会更简单。@S.Akbari我个人会链接到,而不是谷歌项目页面。另外,TakeLast使用队列来反转顺序。不知道这有多有效,我不擅长大O符号@史蒂恩,谢谢。更新。谢谢你的回答,正是我需要的。P1effort@SuhailMumtazAwan检查我的最新答案。我认为如果你使用moreLINQ来实现这个目的,它会更简单。@S.Akbari我个人会链接到,而不是谷歌项目页面。另外,TakeLast使用队列来反转顺序。不知道这有多有效,我不擅长大O符号@史蒂恩,谢谢。更新。