C#黔驴技巧之实现统计结果排名
本節(jié)是實現(xiàn)統(tǒng)計排名的一點技巧,可能有一部分童鞋在實現(xiàn)排名統(tǒng)計繞了一大圈,最后還不如兩行代碼就搞定,代碼清晰而可讀性強,接下來我們來一起來看看。
我們知道在SQL Server中可以利用Row_Number、Rank等函數(shù)進行排名,在MySQL中可以利用變量方式來實現(xiàn)排名,對于計算操作我傾向于放在內(nèi)存中來操作,而數(shù)據(jù)庫只是做簡單的操作,盡管各個數(shù)據(jù)庫可能提供了對應(yīng)函數(shù)來進行處理,但是一旦數(shù)據(jù)量大時,可能擱置到內(nèi)存中計算不失為一種好的方式。接下來我們來看看在C#中如何利用LINQ來進行排名,比如我們需要統(tǒng)計截止到當(dāng)前時間,患者咨詢的醫(yī)生的人次排名(同一患者在同一天咨詢同一醫(yī)生多次只算一次),假設(shè)我們從數(shù)據(jù)庫查詢出醫(yī)生姓名和患者咨詢醫(yī)生的次數(shù),如下:
public?class?Consult {public?string?Name?{?get;?set;?}public?int?Times?{?get;?set;?}public?int?Rank?{?get;?set;?} }var?consults?=?new?List<Consult>() {new?Consult()?{?Name?=?"張三",?Times?=?1?},new?Consult()?{?Name?=?"李四",?Times?=?1?},new?Consult()?{?Name?=?"王五",?Times?=?2?},new?Consult()?{?Name?=?"趙六",?Times?=?3?},new?Consult()?{?Name?=?"小明",?Times?=?0?},new?Consult()?{?Name?=?"小紅",?Times?=?0?} };我們得到了所有醫(yī)生被咨詢的次數(shù)和姓名,接下來我們通過LINQ繼續(xù)對其進行操作,這里最重要需要了解的是投影(Select或SelectMany)具有索引的參數(shù),知道有索引這個參數(shù)一切就好辦了,因為次數(shù)越大說明排名越靠前,所以首先我們需要對上述集合進行倒序,然后再對倒序后的結(jié)果通過次數(shù)進行分組,分組后將導(dǎo)致不同次數(shù)在不同集合中(反之,同次數(shù)在相同集合中),然后通過SelectMany獲取到分組后的指定集合和索引,最后對此集合進行投影就得到了最終的結(jié)果排名,代碼如下:
var?result?=?consults.OrderByDescending(d?=>?d.Times).GroupBy(d?=>?d.Times).SelectMany((g,?i)?=>?g.Select(e?=>?new?Consult(){Name?=?e.Name,Times?=?e.Times,Rank?=?i?+?1})).ToList();上述需注意索引從0開始,所以需要加1,同時針對相同次數(shù)排名會相同,通過此種實現(xiàn)排名的方式,邏輯清晰且代碼精簡,當(dāng)然,投影中含有索引參數(shù)也還可應(yīng)用于其他用途,只不過用于排名的場景還是比較多,暫且到這里,感謝您的閱讀。
總結(jié)
以上是生活随笔為你收集整理的C#黔驴技巧之实现统计结果排名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派销量突然猛增
- 下一篇: Istio Pilot架构解析