日期:2014-05-20  浏览次数:20978 次

求linq统计并排名
已知:
一个等级实体
public class Levels
{
    public string ID { get; set; } //编号
    public string Name { get; set; } //名称
    public int  No   {get;set;}//排名
 
}
 List<Levels> li = new List<Levels>();
        li.Add(new Levels { ID = "A", Name = "一般" });
        li.Add(new Levels { ID = "B", Name = "严重" });
        li.Add(new Levels { ID = "C", Name = "紧急" });
        li.Add(new Levels { ID = "D", Name = "危急" });
一个数据实体
public class Data
{
    public string DID { get; set; }//编号
    public string LID { get; set; }//等级编号(关联Levels中的ID)
    public int Num { get; set; }//次数
}

        List<Data> dli = new List<Data>();
        dli.Add(new Data { DID = "1", LID = "A", Num = 5 });
        dli.Add(new Data { DID = "2", LID = "B", Num = 3 });
        dli.Add(new Data { DID = "3", LID = "C", Num = 3 });


问题:需要根据等级进行次数统计,然后排名(注:1.次数相同排名相同;2.没有出现的等级次数为0,也要出现)
        {linq语句}
结果:
         排名          等级        次数
          1            一般            5
          2            严重            3
          2            紧急            3
          3            危急            0
 
------解决方案--------------------
var temp = li.Select((x) =>
            {
                var listdli = dli.Where(y => y.LID == x.ID);
                return new
                {
                    等级 = x.Name,
                    次数 = listdli.Count() == 0 ? 0 : listdli.First().Num
                };
            }).OrderByDescending(x=>x.次数);
------解决方案--------------------
本帖最后由 q107770540 于 2013-11-01 14:57:14 编辑

int i=1;
var query=from l in li
          join d in dli on l.ID equals d.LID into lg
  from d in lg.DefaultIfEmpty()
  orderby d==null?0:d.Num descending 
  select new 
{
    Index=i++,
Name=l.Name,
Num=d==null?0:d.Num
};


排名方面,等我一会开玩会,再想想有没有什么好的实现方式,先这样
------解决方案--------------------
1L的思路是对的,只是没有排序。
其实排序很简单
class static MyLinqHelper
{
    public static IEnumerable<TResult> Select<TInput, TResult>(this IEnumerable<TInput> data, Func<TInput, TResult, int> selector)
    {
        TResult pre = default(TResult);
        int i = 0;
        foreach (var item in data)
        {
            TResult current = selector(item, pre, i);