【发布时间】:2011-07-16 02:00:38
【问题描述】:
我有一个包含大量字符串的 ArrayList。它需要根据 Name、Age 和 Amt 三个字段(本质上是三个子字符串)进行就地排序。 Age 是第一个子字符串(位置 0-3),Name 是第二个 (3-6),Amt 是最后一个 (6-10) .这些参数的排序顺序非常重要,如下所示:
首先按姓名进行升序排序,然后按年龄进行升序排序(实际上在substring) 然后按 Amt 进行 降序 排序。就是这样。
我有这门课
public class ArrComparer : IComparer
{
public int Compare(object x, object y)
{
string left = x.ToString();
string right = y.ToString();
string lhs = left.Substring(3, 6);
string rhs = right.Substring(3, 6);
return lhs.CompareTo(rhs);
}
}
我使用它仅基于一个字段进行排序 - 通过调用命名
RecordList.Sort(new ArrComparer());
这让我可以根据 one 字段正确排序。问题是如何修改此代码以允许我根据所有三个AT ONCE、以正确的顺序并使用正确的 asc/desc 模式进行排序?
任何代码或提示将不胜感激。 (顺便说一句,如果您想知道使用通用 List<T> 不是这个项目的选项)。
【问题讨论】:
-
为什么通用列表“不是一个选项”?为什么不使用具有三个字段的对象而不是字符串?
-
你介意说为什么通用列表不是一个选项吗?
-
想清楚。你如何进行常规的字母排序?你比较第一个字母。如果它们不同,那么您就知道顺序。如果它们相等,则比较第二个字母。等等。这里也一样。你如何按名字排序,然后是年龄,然后是数量?比较两个名字。他们不平等吗?然后你就知道顺序了。他们平等吗?然后比较年龄。他们不平等吗?然后你就知道顺序了。他们平等吗?然后比较金额。
-
“你介意说为什么通用列表不是一个选项吗?”这是一个公平的问题,简单的答案是,这是一个更大的项目的一小部分,该项目是不久前编写的,并且依赖于现有的数据结构。此时更改它们会比使用现有的更困难。
-
Eric,这本质上是从 COBOL 转换而来的,这就是结果在原始程序中的排序方式。此外,只要可以在这里使用 LINQ,它也是一种选择。在这一点上,我实际上对此知之甚少。顺便说一句,感谢所有回复的人。
标签: c# .net sorting arraylist icomparer