如何按wpf中的后续数字对数组列表进行排序?

时间:2012-10-30 09:11:55

标签: c# wpf arraylist

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();

如果我运行此程序,我将得到以下结果

enter image description here

但是我想对列表进行排序,如 Item1,Item2,Item3,Item4,Item5,Item6,Item7,Item8,Item9,Item10,Item11

5 个答案:

答案 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方法。

http://msdn.microsoft.com/en-us/library/0e743hdt.aspx