c# – 如何使用LinQ获取列表的前N个元素?

我有一个按考试点排序的列表,我希望得到这个列表的前N个元素.
如果N(th)和N 1(th)学生具有相同的考试点,则列表必须同时具有它们.

例如,我有一个这样的列表:

john.   80  
mike.   75  
james.  70  
ashley. 70
kate.   60

前三名应该回到约翰,迈克,詹姆斯,阿什利
我试过Take(),但它只返回john,mike,james

英语不是我的主要语言,对不起,如果我说不出来的话
谢谢

解决方法

这是一个一次通过的实现:
public static IEnumerable<TSource> TopWithTies<TSource,TValue>(
    this IEnumerable<TSource> source,int count,Func<TSource,TValue> selector)
{
    if (source == null) throw new ArgumentNullException("source");
    if (selector == null) throw new ArgumentNullException("selector");
    if (count < 0) throw new ArgumentOutOfRangeException("count");
    if (count == 0) yield break;
    using(var iter = source.OrderByDescending(selector).GetEnumerator())
    {
        if(iter.MoveNext())
        {
            yield return iter.Current;
            while (--count >= 0)
            {
                if(!iter.MoveNext()) yield break;
                yield return iter.Current;    
            }
            var lastVal = selector(iter.Current);
            var eq = EqualityComparer<TValue>.Default;
            while(iter.MoveNext() && eq.Equals(lastVal,selector(iter.Current)))
            {
                yield return iter.Current;
            }
        }
    }
}

用法示例:

var data = new[]
{
    new { name = "john",value = 80 },new { name = "mike",value = 75 },new { name = "james",value = 70 },new { name = "ashley",new { name = "kate",value = 60 }
};
var top = data.TopWithTies(3,x => x.value).ToList();
foreach(var row in top)
{
    Console.WriteLine("{0}: {1}",row.name,row.value);
}

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...