使用OrderBy<>对项目数组进行排序

时间:2009-03-06 21:38:31

标签: c# arrays sorting

我有一系列项目,我想对其中一个属性进行排序。 我可以使用“ item.Fields [”FieldName“]访问items属性。值”该属性以字符串形式返回,但我可以将其强制转换为int。

我查看了OrderBy<>但我不知道如何使用它。

5 个答案:

答案 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执行稳定的排序。

  

此方法执行稳定的排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序。