求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);
pre = current;
i++;
yield return current;
}
}
}
使用