我有一系列项目,我想对其中一个属性进行排序。 我可以使用“ item.Fields [”FieldName“]访问items属性。值”该属性以字符串形式返回,但我可以将其强制转换为int。
我查看了OrderBy<>但我不知道如何使用它。
答案 0 :(得分:42)
要清楚,OrderBy
不会对数组进行排序 - 它将返回一个新序列,该序列是数组的已排序副本。如果没关系,那么你想要 之类的东西:
var sorted = array.OrderBy(item => item.Fields["FieldName"].Value);
另一方面,我不理解您的注释,该属性作为字符串返回,但您可以将其强制转换为int - 您不能将字符串转换为整数,您必须解析它们。如果这就是你的意思,你可能想要:
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
如果您希望将其作为数组,则可以在之后调用ToArray()
:
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value))
.ToArray();
或者,如果您想要就地排序,可以使用Array.Sort
,但这样会有些麻烦。
答案 1 :(得分:9)
使用Sort方法对数组进行排序:
Array.Sort(theArray, (a, b) => String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value));
如果您不使用C#3,则使用委托而不是lambda表达式:
Array.Sort(theArray, delegate(Item a, Item b) { return String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value); } );
(这也适用于框架2,OrderBy扩展程序不支持。)
答案 2 :(得分:5)
如果您可以轻松使用orderby,请尝试以下操作。我投入了int.Parse,虽然取决于你实际想要排序的方式,但这可能不是必需的。
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
答案 3 :(得分:4)
var sortedArray = items.OrderBy(i => i.property).ToArray();
如果你不想要一个数组,你可以将其关闭,在这种情况下,你将拥有一个IEnumerable<>类型项目。
答案 4 :(得分:0)
值得一提的是,List<T>.Sort
是基于快速排序的,在大多数情况下,它不是稳定的排序。
此实现执行不稳定的排序;也就是说,如果两个元素相等,则可能不会保留其顺序。相反,稳定排序会保留元素相等的顺序。
不过,您可以使用Enumberable.OrderBy
执行稳定的排序。
此方法执行稳定的排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序。