使用LINQ查询选择具有最大值的List 项
我有List loadRecords,其中T类型定义如下
public class TransformerLoadRecord { public double TotalLoadKva { get; set; } public double TotalLoadKwh { get; set; } public string LoadDate { get; set; } public string LoadTime { get; set; } public long Fid { get; set;} public string UserId { get; set; } public string SessionId { get; set; } public override string ToString() { return "User Id:" + UserId + " Session Id:" + SessionId + " Fid:" + Fid.ToString() + " Load Date:" + LoadDate + " Load Time:" + LoadTime + " Total Load KWH:" + TotalLoadKwh.ToString() + " Total Load KVA:" + TotalLoadKva.ToString(); } }
我需要从项目列表中获取具有最大TotalLoadKva的项目(大约1900)这是工作
var mxKVALoad = loadRecords.Max(l => l.TotalLoadKva);
但我需要所有其他属性,此代码不起作用并返回多个项目
var maxLoadRecord = from txLoadValues in loadRecords group txLoadValues by txLoadValues.TotalLoadKva into txLoadValueGroup select txLoadValueGroup.OrderByDescending(l => l.TotalLoadKva).FirstOrDefault();
我在这做错了什么? 你能解释一下吗?
谢谢。
您需要对源列表进行排序(降序)并获取第一个元素:
var elementWithMaxKVA = loadRecords.OrderByDescending(l => l.TotalLoadKva).FirstOrDefault();
但这不是最快的方法,因为OrderBy*
必须做更多的工作而不是简单地查找最大值。
您可以改为实现自己的扩展方法:
// error handling and argument checks ommitted for brevity public static TSource MaxBy(this IEnumerable source, Func selector) where TComp : IComparable { using (var enumerator = source.GetEnumerator()) { TSource max = default(TSource); TComp maxV = default(TComp); if (!enumerator.MoveNext()) return max; // or throw max = enumerator.Current; maxV = selector(max); while(enumerator.MoveNext()) { TSource current = enumerator.Current; TComp currentV = selector(current); if (currentV.CompareTo(maxV) <= 0) continue; maxV = currentV; max = current; } return max; } }
并使用它
var elementWithMaxKVA = loadRecords.MaxBy(l => l.TotalLoadKva);
我认为MoreLinq nuget包已经包含了这样的MaxBy
方法。
我不认为你需要将它们分组以获得具有最高TotalLoadKva
记录,你可以使用OrderByDescending
在OrderByDescending
上对它们进行排序,然后使用First
或FirstOrDefault
方法选择最上面的第一条记录:
var maxKVALoad = loadRecords.OrderByDescending(l => l.TotalLoadKva).FirstOrDefault(); // will return the record with highest value of TotalLoadKva
首选的方法是使用FirstOrDefault()
因为First()
将抛出exception说:
序列不包含任何元素
如果保证总会返回行,那么First()
可以安全使用,否则使用FirstOrDefault
,如果collection为空,它将不会抛出exception。
以下应该有效:
var mxKVALoad = loadRecords .Where(l => l.totalLoadKva == loadRecords.Max(l => l.TotalLoadKva));
或者,您可以使用MoreLINQ
库中的MoreLINQ
上述就是C#学习教程:使用LINQ查询选择具有最大值的List 项分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/954751.html