当前位置: 首页 > 编程语言 > C#

根据某些标准从集合中选择最大的项目分享

时间:2023-04-10 17:45:21 C#

Selectthelargestitemfromacollectionbysomecriteria我是.net3.5的新手。我有一个项目集合:IList模型;其中classModel{publicstringName{get;私有集;}}我想获取名称长度最长的元素。我试过stringmaxItem=models.Max(model=>model.Name.Length);但当然它会返回最大长度(我需要一个模型对象)。我知道有一种方法可以使用扩展方法来做到这一点,但我不知道怎么做。这就是我开始工作的方式。也许有更好的方法,我不确定:decimalde=d.Max(p=>p.Name.Length);模型a=d.First(p=>p.Name.Length==de);不幸的是,是的,没有内置的方法来做到这一点——但是编写一个扩展方法来做到这一点真的很容易。事实上,这是我的第一篇博文……请注意,其中一条评论中有更好的实现。如果我有时间,我会把它搬进身体里。编辑:好的,我有一个稍微简化的版本——它只返回使用给定选择器的最大元素。也无需进行投影-如果需要,您可以稍后进行。请注意,您可以删除TValue上的约束并使用Comparer.Default,或者使用允许将比较指定为另一个参数的重载。publicstaticTSourceMaxBy(thisIEnumerablesource,Funcselector)whereTValue:IComparable{TValuemaxValue=default(TValue);TSourcemaxElement=default(TSource);boolgotAny=false;foreach(TSourcesourceValueinsource){TValuevalue=selector(sourceValue);如果(!gotAny||value.CompareTo(maxValue)>0){maxValue=value;最大元素=源值;得到任何=真;}}if(!gotAny){thrownewInvalidOperationException("sourceisempty");}返回最大元素;示例用法:(注意类型推断):stringmaxName=models.MaxBy(model=>model.Name.Length).Name;这是另一种方法。有一个没有标准的Max版本,它使用IComparable。所以我们可以提供一种方法来将任何东西包装在一个可比较的对象中,并使用一个委托来提供比较。公共类Comparable:IComparable>{privatereadonlyT_value;私有只读函数比较;publicComparable(Tv,Funccompare){_value=v;_比较=比较;}publicTValue{get{return_value;}}publicintCompareTo(Comparableother){return_compare(_value,other._value);然后我们可以说:ModelmaxModel=models.Select(m=>newComparable(m,(a,b)=>a.Name.Length-b.Name.Length)).Max().Value;这涉及到很多额外的分配,但它在学术上有点有趣(我认为)。您可以使用聚合。无需编写新的扩展方法即可完成。models.Aggregate(newKeyValuePair(),(a,b)=>(a.Value(b,b.Name.Length):a,a=>a.Key);使用扩展方法有什么好处吗?也许一个简单地遍历列表的方法或程序就足够了?一些有效的暗淡结果是string=models(0).Nameforeachmasmodelinmodelsifm.Name.length>result.lengththenresult=m.以防下一个另一种方式的名称可以是:varitem=(fromminmodelsselectmorderbym.Name.Lengthdescending).FirstOrDefault();第一个将是长度最长的那个。以上就是C#学习教程:按照一定的标准从集合中选择最大的项目分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: