我想对一个 String
的 ArrayList
进行排序。
给定:
{A,C,AA,B,CC,BB}
Arraylist.Sort
将会返回:
{A,AA,B,BB,C,CC}
What I need is:
{A,B,C,AA,BB,CC}
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
sorted
变量之后,在实际调用之前修改了list
- 它仍将包含新元素。sorted
查询以延迟方式执行。 - Ilya Ivanovstring [] 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();
ToArray()
方法(或者直接使用 List<string>
替代 ArrayList)来利用 OrderBy
和 ThenBy
函数。代码如下所示:list = list.OrderBy(/*Order it by length*/).ThenBy(/*Order alphabetically*/);
这有点老派,但我使用了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
null
值放入该集合中,看看会发生什么。 - ServyIComparable
接口的类,该类接受两个字符串并按照以下方式进行排序:if (a.Length == b.Length)
return String.Compare(a, b);
return a.Length.CompareTo(b.Length);
你可能还想处理null
情况。
List<string>
的原因是什么? - Tim Schmelter