ArrayList SortItems = new ArrayList();
SortItems.Add("Item1");
SortItems.Add("Item2");
SortItems.Add("Item3");
SortItems.Add("Item4");
SortItems.Add("Item5");
SortItems.Add("Item6");
SortItems.Add("Item7");
SortItems.Add("Item8");
SortItems.Add("Item9");
SortItems.Add("Item10");
SortItems.Add("Item11");
SortItems.Sort();
如果我运行此程序,我将得到以下结果
但是我想对列表进行排序,如 Item1,Item2,Item3,Item4,Item5,Item6,Item7,Item8,Item9,Item10,Item11
答案 0 :(得分:4)
构建自定义比较器:
public class CusComparer: IComparer
{
public int Compare(object x, object y)
{
return int.Parse((x as string).Substring(4)) - int.Parse((y as string).Substring(4));
}
}
所以你可以使用:
ArrayList SortItems = new ArrayList();
SortItems.Add("Item1");
SortItems.Add("Item2");
SortItems.Add("Item3");
SortItems.Add("Item4");
SortItems.Add("Item5");
SortItems.Add("Item6");
SortItems.Add("Item7");
SortItems.Add("Item8");
SortItems.Add("Item9");
SortItems.Add("Item10");
SortItems.Add("Item11");
SortItems.Sort(new CusComparer());
但是,您应该考虑使用更强类型的ArrayList
List<T>
答案 1 :(得分:1)
结果以这种方式排序,因为它在字符串上使用了词典排序。比较算法从左到右比较两个字符串,由于"1"
小于"9"
,"10"
也会小于"9"
。
你可以用零填充字符串的数字部分,例如"Item05"
代替"Item5"
。
更通用和灵活的方法是使用ArrayList.Sort(IComparer)
,并实现一个理解字符串格式的IComparer
,并且可以正确排序字符串。
答案 2 :(得分:0)
你的问题没有显示它给出了什么样的结果。
使用SortedList。当您添加新项目时,它将被排序。 http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx 在下行方面,您不能重复投入。
答案 3 :(得分:0)
如果它始终以"Item"
为前缀,您可以拆分它们并按数量部分排序。
请注意,我将使用强类型List<String>
代替:
List<String> SortItems = list.Select(s => new
{
Item = s,
Number = int.Parse(s.Substring("Item".Length))
}).OrderBy(x => x.Number)
.Select(x => x.Item).ToList();
或者您可以使用this Sort
method重载直接对原始列表进行排序:
list.Sort((a, b) =>
int.Parse(a.Substring("Item".Length)).CompareTo(int.Parse(b.Substring("Item".Length)))
);
答案 4 :(得分:0)
您可以实施IComparer
并将其传递给Sort
方法。