如何按字符串长度对字符串数组进行排序

3
我有一个字符串数组,例如"blue"、"green"、"red",我希望将它们按照长度排序,最长的排在最前面,最短的排在最后面。
目前,我正在创建另一个数组,其中包含与原数组中每个字符串相同位置的字符串长度,并使用该数组作为关键数组进行排序,如下所示。但我认为这可能可以优化为一行代码?
Dim colours() As string = {"blue", "green", "red"}
Dim colourslength() As Integer
For i As Integer = 0 To colours.Length - 1
 colourslength(i) = colours(i).Length
Next
Array.Sort(colourslength, colours)
Array.Reverse(colours)

编辑:刚意识到在示例代码中我将颜色定义为列表,但在我的实际代码中是一个数组。


1
我猜测是 .net 4,因为在早期版本中,内联列表初始化是无效的。 - Jon Egerton
这是 .NET 4,我不小心使用了一个列表,对此很抱歉。 - Marcus Lars
4个回答

4

另一种Linq解决方案(注意,已从C#转换)

Dim Sorted = From p In colours Order By p.Length Descending Select p

3
在 VB.NET 中,“Select”不是必需的关键字。如果省略,则选择的元素将是元素类型。翻译的内容为:“Dim q = From el In colours Order By el.Length Descending”。在这句话中,从“colours”中选择一个元素“el”,按长度降序排序,并将结果保存在变量“q”中。 - Oybek

3
我的观点是这是最短的方法。使用linq。
Dim strs = New String() {"", "333", "22", "4444", "55555", "1"}
Dim sorted = strs.OrderBy(Function(x) x.Length).ThenBy(Function(x) x).ToArray()

编辑

如果你想要一个反向排序,只需摆脱额外的方法调用并以相反的顺序进行排序即可。

Dim strs = New String() {"", "333", "22", "4444", "55555", "1"}
Dim sorted = strs.OrderByDescending(Function(x) x.Length).ThenByDescending(Function(x) x).ToArray

干杯。


OrderBy 需要改为 OrderByDescending,因为他想要最长的排在前面。 - Jon Egerton
你能解释一下这行代码的第二部分是干什么的吗?Dim sorted = strs.OrderByDescending(Function(x) x.Length).ThenByDescending(Function(x) x).ToArray,我理解第一部分是实际进行排序的,那么ThenByDescending(Function(x) x)部分呢? - Marcus Lars
@MarcusLars,OrderByDescending(Function(x) x.Length)按长度排序。当有相等长度的字符串时,将应用ThenBy。两个相等长度的字符串将按字母顺序排序。 - Oybek

3
Dim colours = {"blue", "green", "red"}
Dim coloursSortedByLength = colours.OrderByDescending(Function(c) c.Length)

输出序列为:绿色,蓝色,红色。

2

最简单的方法是将列表中的每个字符串与所有其他字符串进行比较:

在Java中:

for(int i=0; i<list.length-1; i++){
    for(int j=i+1; j<list.length; j++){
        if(list[i].length() < list[j].length()){
            tmp = list[i];
            list[i] = list[j];
            list[j] = tmp;
        }
    }
}

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