C#如何对Arraylist中的字符串按字母顺序和长度排序

4

我想对一个 StringArrayList 进行排序。

给定:

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

Arraylist.Sort将会返回:

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

What I need is:

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

1
首先根据长度将列表拆分为单独的列表,然后对它们进行单独排序。 - Moriya
1
不使用强类型的 List<string> 的原因是什么? - Tim Schmelter
1
使用ArrayList比LinkedList速度更快。 - rbtLong
5个回答

12
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,它只是从该集合创建一个新的值序列。(这可能是可以接受的,但重要的是要意识到这一点。) - Servy
是的,当然,好的注意。另一个需要注意的是,即使在声明了sorted变量之后,在实际调用之前修改了list - 它仍将包含新元素。sorted查询以延迟方式执行。 - Ilya Ivanov

4
使用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();

0
我建议使用 ToArray() 方法(或者直接使用 List<string> 替代 ArrayList)来利用 OrderByThenBy 函数。代码如下所示:
list = list.OrderBy(/*Order it by length*/).ThenBy(/*Order alphabetically*/);

0

这有点老派,但我使用了IComparer接口……

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

1
现在将一个 null 值放入该集合中,看看会发生什么。 - Servy
很抱歉我没有在问题中看到那个。我只是想回答这个问题。不过感谢你指出来。 - rbtLong
如果你只是编写代码来显示那个例子的排序值,那么你可能就只需要打印出A、B、C等等。这只是一个示例输入,而不是他将要输入的唯一内容。 - Servy
感谢您的挑剔。明智的,先生。 - rbtLong
1
是的,稳健可靠的代码被高估了;使用更长、更复杂、更难理解且偶尔会崩溃的代码要好得多,特别是在有明智的行动方案时。 - Servy
显示剩余2条评论

0
你可以创建一个实现 IComparable 接口的类,该类接受两个字符串并按照以下方式进行排序:
if (a.Length == b.Length)
    return String.Compare(a, b);
return a.Length.CompareTo(b.Length);

你可能还想处理null情况。


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