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

26

我有一个项目数组,想要按照其中一个属性进行排序。 我可以使用 "item.Fields["FieldName"].Value" 访问该属性,但它作为字符串返回,但是我可以将其强制转换为整数。

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

5个回答

48

明确一点,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,但这可能会有些凌乱。


@skeet 我遇到了几乎相同的问题,我也发布了一个问题 https://dev59.com/hGbWa4cB1Zd3GeqPYqCQ - rahularyansharma
谢谢,Jon。很高兴知道这是一个非破坏性操作。 - Kevin Meredith
你需要包含哪个库才能使用 OrderBy - AlbatrossCafe
1
@AlbatrossCafe:只需使用 System.Linq 指令和对 System.Core 程序集的引用即可。(现在可能已经移动了...不确定。) - Jon Skeet
@JonSkeet 您是正确的,它是System.Linq。谢谢! - AlbatrossCafe

10

使用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扩展则不适用。)


这只是一行代码,没有额外的变量。这应该真正是答案。 - toddmo

5
如果您可以使用 orderby,那么应该很容易,尝试以下操作。我加入了 int.Parse,虽然根据您实际想要排序的方式,这可能不是必需的。
var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));

4
var sortedArray = items.OrderBy(i => i.property).ToArray();

如果您不想要一个数组,可以省略它,这样您将得到一个类型为item的IEnumerable<>。

1
值得一提的是,List<T>.Sort 是基于快速排序实现的,在大多数情况下它不是稳定排序。

该实现执行不稳定排序;也就是说,如果两个元素相等,则它们的顺序可能不被保留。相比之下,稳定排序会保留相等元素的顺序。

然而,你可以使用 Enumberable.OrderBy 来执行稳定排序。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接