【问题标题】:C# sort Arraylist strings alphabetical and on lengthC# 按字母和长度对 Arraylist 字符串进行排序
【发布时间】:2012-12-24 23:29:50
【问题描述】:

我正在尝试对ArrayList 中的String 进行排序。

给定:

{A,C,AA,B,CC,BB}

Arraylist.Sort 给出:

{A,AA,B,BB,C,CC}

我需要的是:

{A,B,C,AA,BB,CC}

【问题讨论】:

  • 首先根据长度将列表拆分为单独的列表,然后单独排序。
  • 是否有理由不使用强类型List<string>
  • 使用 ArrayList 比使用 LinkedList 有速度优势。

标签: c# string sorting arraylist


【解决方案1】:

这是一种老派,但我使用了 IComparer Interface 。 . .

public class SortAlphabetLength : System.Collections.IComparer
{
    public int Compare(Object x, Object y)
    {
        if (x.ToString().Length == y.ToString().Length)
            return string.Compare(x.ToString(), y.ToString());
        else if (x.ToString().Length > y.ToString().Length)
            return 1;
        else
            return -1;
    }
}

然后测试它。 . .

class Program
{
    static void Main(string[] args)
    {
        ArrayList values = new ArrayList()
        {
            "A","AA","B","BB","C","CC"
        };

        SortAlphabetLength alphaLen = new SortAlphabetLength();
        values.Sort(alphaLen);

        foreach (string itm in values)
            Console.WriteLine(itm);
    }
}

输出:

A
B
C
AA
BB
CC

【讨论】:

  • 现在在该集合中添加一个null 值,看看会发生什么。
  • 很抱歉,我没有在问题中看到这一点。我只是想回答这个问题。感谢您指出这一点。
  • 如果您编写的代码只显示该示例的排序值而不是打印出 A、BC、... 这是 example 输入,不是他必须投入其中的唯一投入。
  • 感谢您的吹毛求疵。明智的,先生。
  • 是的,有效的健壮代码被高估了;最好使用更长、更复杂、更难理解并且在采取合理行动时偶尔会崩溃的代码。
【解决方案2】:
ArrayList list = new ArrayList {"A","C","AA","B","CC","BB"};

var sorted = list.Cast<string>()
                 .OrderBy(str => str.Length)
                 .ThenBy(str => str);

//LinqPad specific print call
sorted.Dump();

打印:

A 
B 
C 
AA 
BB 
CC 

【讨论】:

  • 请注意,这不会修改 ArrayList,它会从该集合中创建一个新的值序列。 (这可能是可以接受的,重要的是要意识到这一点。)
  • 是的,当然,好记。另请注意,即使您在声明 sorted 变量之后,但在实际调用之前修改 list,它也会包含新元素。 sorted 查询正在以延迟方式执行
【解决方案3】:

您可以创建一个IComparable 类,接收两个字符串并按如下方式对它们进行排序:

if (a.Length == b.Length)
    return String.Compare(a, b);
return a.Length.CompareTo(b.Length);

您可能还想处理null 案件。

【讨论】:

    【解决方案4】:

    我建议使用ToArray() 方法(或仅使用ArrayList 的List&lt;string&gt; instad)来利用OrderByThenBy 函数。它看起来像这样:

    list = list.OrderBy(/*Order it by length*/).ThenBy(/*Order alphabetically*/);
    

    【讨论】:

      【解决方案5】:

      使用 Linq 更容易做到这一点:

      string [] list = { "A","C","AA","B","CC","BB"};
      
      var sorted = list.OrderBy(x=>x.Length).ThenBy(x=>x);
      

      注意OrderBy 方法返回一个新列表。如果你想修改原来的,那么你需要重新分配它:

      list = list.OrderBy(x=>x.Length).ThenBy(x=>x).ToArray();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-26
        • 2021-04-05
        • 1970-01-01
        • 2015-10-16
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        相关资源
        最近更新 更多