c# - 数组列表排序

标签 c# .net sorting arraylist icomparer

我有一个包含大量字符串的 ArrayList。它需要根据姓名年龄金额这三个字段(本质上是三个子字符串)进行就地排序。 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());

这让我可以根据一个 字段正确排序。问题是我如何修改此代码以允许我根据所有三个 AT ONCE 以正确的顺序并使用正确的 asc/desc 模式进行排序?

任何代码或提示将不胜感激。 (顺便说一下,如果您想知道在这个项目中使用通用 List<T> 不是一个选项)。

最佳答案

ArrayList 仍然实现 IEnumerable,这意味着您可以在 linq 中使用简单的 orderby() 和 thenby() 扩展:

RecordList = new ArrayList(
         RecordList.Cast<string>().OrderBy(s => s.Substring(3,3))
                   .ThenBy(s => int.Parse(s.Substring(0,3)))
                   .ThenByDescending(s => double.Parse(s.Substring(6,4)))
          .ToArray());

表达这一点的其他方法包括构建更复杂的 .OrderBy() 或使用匿名类型将字符串组合为对象:

RecordList = new ArrayList(
       Record.Cast<string>().Select(s => new {source = s, age = int.Parse(s.Substring(0, 3)), name = s.Substring(3,3), amt = double.Parse(s.Substring(6,4))})
             .OrderBy(o => o.name)
             .ThenBy(o => o.age)
             .ThenByDescending(o => o.amt)
          .Select(o => o.source).ToArray());

我喜欢这个选项,因为它会让你开始用对象来思考。正确玩牌,您可以跳过最后一个 .Select() 投影以保留对象而不是返回字符串,这将节省以后必须重新进行所有解析的工作

如果这些不是一个选项(可能与您不能使用 List 的原因相同),可以很容易地修改您现有的比较方法,如下所示:

public class ArrComparer : IComparer
{
    public int Compare(object x, object y)
    {
        int result;
        string left = x.ToString();
        string right = y.ToString();
        string lhs1 = left.Substring(3, 3);
        string rhs1 = right.Substring(3, 3);
        result = lhs1.CompareTo(rhs1);

        if (result == 0)
        {
           int lhs2 = int.Parse(left.Substring(0,3));
           int rhs2 = int.Parse(right.Substring(0,3));
           result = lhs2.CompareTo(rhs2);
        }

        if (result == 0)
        {
            double lhs3 = double.Parse(left.Substring(6,4));
            double rhs3 = double.Parse(right.Substring(6,4));
            result = rhs3.CompareTo(lhs3);
        }

        return result;
    }
}

关于c# - 数组列表排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5317104/

相关文章:

c# - 我如何开始使用 SharpSVN?

.net - 强调SplitContainer

.net - .NET Micro Framework的硬件

ruby-on-rails - has_many :通过关联,shell 中的 Rails 控制台中的 "No Method Error",NoMethodError:#<ActiveRecord::Relation:> 的未定义方法

c# - 在 Visual Studio 2010 中保存 .ASCX 文件需要 3 分钟

c# - 如何在扩展管理器中卸载 Microsoft Web 开发人员工具

c# - Entity Framework 无法打开登录请求的数据库 - 用户登录失败

php - 多个值的哈希方法?

javascript - 如何在angular js中使用嵌套对象将ng-repeat中的数据排序为JSON数据

c# - 并行事件订阅者 .net 4.5