在C#中,按字符串属性对对象列表进行排序并获得正确顺序的最佳方法是什么?我有一个“问题”对象列表,我想按“优先级”字段对它们进行排序。问题是“Priority”是一个字符串名称,如“HIGH”、“MEDIUM”,所以我没有可以排序的ID。如何排序并告诉排序器“HIGH”高于“MEDIUM”高于“LOW”?显而易见的方法是:string[]priorities={"LOW","MEDIUM","HIGH"};varorderedIssues=issues.OrderByDescending(issue=>Array.IndexOf(priorities,issue.Priority));但考虑使用数组示例:publicenumPriority{Low,Medium,High}varorderedIssues=issues.OrderByDescending(issue=>(Priority)Enum.Parse(typeof(Priority),issue.Priority,true));更好的方法是使用枚举类型作为属性/字段本身的类型,在这种情况下它很简单(并且不易出错):varorderedIssues=issues.OrderByDescending(issue=>issue.Priority);最简单的方法可能是:privatestaticintMapPriority(stringpriority){switch(priority.ToUpperInvariant())//如果安全则跳过大小写位{case"HIGH":return1;案例“中等”:返回2;案例“低”:返回3;默认值:返回4;}}varsorted=someCollection.OrderBy(i=>MapPriority(i.PriorityProperty));使用数据库支持的表单,您需要在数据库中有一个可以调用的函数。这只存在于记忆中。可能的值太多了,我基于字典而不是手工编码。在这种情况下,我将手动编写三个代码(除非使用的值可能会发生变化,这是一种进一步的复杂化,使基于字典的方法成为唯一的方法)。如果对大量这些项目进行排序,或对此进行大量调用,我会使用IComparer实现,或者让项目本身实现IComparable。在这种特定情况下,您还可以使用Linq的OrderBy方法:varsortedList=issueList.OrderBy(i=>i.Priority=="HIGH"?1:i.Priority=="MEDIUM"?2:3).ToList();作为单线,这不会太糟糕。您还可以按照您希望的排序顺序将字符串放入数组、列表或字典中(或者在字典的情况下将排序顺序作为值包含在内)。使用OrderBy的一个缺点是它不会影响源列表,除非您通过将列表重新分配给结果来告诉它这样做。在所有情况下,它都会创建两个额外的集合;OrderBy内部使用的数组或列表(排序必须知道它们正在排序的整个集合)和ToList()生成的列表。所以这将需要O(2N)额外的内存,而List.Sort()可以就地完成(不确定它是否实用,但它确实使用通常就地的QuickSort)。publicenumPriority{LOW=1,MEDIUM=2,HIGH=3}issues.OrderByDescending(issue=>issue.Priority);像这样:对列表进行排序并使其按正确顺序排列的最佳方法是什么?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注—Listissues=...;varresult=issues.OrderBy(x=>x.Priority=="HIGH"?1:x.Priority=="MEDIUM"?2:3);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
