如何在C#中对数组列表的元素进行排序

时间:2009-05-12 12:14:43

标签: c#

我有一个包含

的ArrayList
[0] = "1"
[1] = "10"
[2] = "2"
[3] = "15"
[4] = "17"
[5] = "5"
[6] = "6"
[7] = "27"
[8] = "8"
[9] = "9"

现在我需要对数组列表进行排序,使其成为

[0] = "1"
[1] = "2"
[2] = "5"
[3] = "6"
[4] = "8"
[5] = "9"
[6] = "10"
[7] = "15"
[8] = "17"
[9] = "27"

最后,我将从ArrayList获取值并将它们用作'int'值。我怎样才能做到这一点?或者我应该首先将它们转换为int然后对它们进行排序。?

10 个答案:

答案 0 :(得分:14)

如果您可以确定该列表仅包含可以转换为整数的字符串,那么使用 IEnumerable<T>.OrderBy 扩展方法,请尝试以下操作:

var sortedList = list.OrderBy(item => int.Parse(item));

如果您使用的是ArrayList而不是List<string>(嘘!),则首先需要Cast

var sortedList = list.Cast<string>().OrderBy(item => int.Parse(item));

你也可以像JaredPar所说的那样定义你自己的比较器,但IMO对已经实现的东西有很多工作要做。但是,它更有效率。

答案 1 :(得分:6)

框架中有许多排序方法,包括ArrayList.Sort。问题是它们都按字母顺序而不是数字排序。您需要编写一个可以理解数字排序的自定义排序器。

尝试以下方法(为简洁起见,遗漏了一些参数检查)

public class NumericComparer : IComparer {
  public int Compare(object x, object y) {
    string left = (string)x; 
    string right = (string)y;
    int max = Math.Min(left.Length, right.Length);
    for ( int i = 0; i < max; i++ ) {
      if ( left[i] != right[i] ) { 
        return left[i] - right[i];
      }
    }
    return left.Length - right.Length;
  }
}

list.Sort(new NumericComparer());

答案 2 :(得分:6)

实现自定义比较器并将其传递给ArrayList.Sort()

完整代码:

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList a = new ArrayList();
            a.Add("1");
            a.Add("13");
            a.Add("3");
            a.Add("25");
            a.Add("2");
            a.Add("12");
            a.Sort(new CustomComparer());

            foreach (String s in a)
                Console.WriteLine(s);

            Console.Read();
        }


    }

    public class CustomComparer : IComparer
    {
        Comparer _comparer = new Comparer(System.Globalization.CultureInfo.CurrentCulture);

        public int Compare(object x, object y)
        {
            // Convert string comparisons to int
            return _comparer.Compare(Convert.ToInt32(x), Convert.ToInt32(y));
        }
    }
}

输出:

1 2 3 12 13 25

答案 3 :(得分:4)

也许您可以将值存储在像List这样的强类型列表中,并在必要时将它们转换为字符串,当它们使用它们时。像这样:

        List<int> intList = new List<int>(new int[] {3, 2, 1});

        intList.Sort();

        foreach (int theInt in intList)
        {
            System.Diagnostics.Debug.WriteLine(theInt.ToString());
        }

答案 4 :(得分:1)

您最好使用Int值创建另一个数组,然后使用ArrayList.Sort()对其进行排序。你可以调用ArrayList.Sort()并传递一个委托,将这些字符串作为数字进行比较,但速度会慢一些。慢多少取决于你的阵列的大小,我个人认为不到100的大小并不重要。

答案 5 :(得分:0)

如果值都是整数,那么为什么不将它们存储为整数?这将使排序更容易,更快。

使用的其他方法是什么?如果它们仅用作字符串并且只排序一次那么将它们保留原样可能是明智的 - 作为字符串。

另一方面,如果他们在数学运算中使用,那么最好将它们存储为整数。

答案 6 :(得分:0)

 List<int> liDllCnt = new List<int>();
 for (int temp = 0; temp < alFileName.Count; temp++)
     liDllCnt.Add(Int32.Parse(alFileName[temp].ToString()));
 liDllCnt.Sort();

alFileName是我使用的arraylist的名称。

答案 7 :(得分:0)

这是最安全的方式

aryList是您的ArrayList实例

                object[] list = aryList.ToArray();
                Array.Sort<object>
                    (
                        list,
                        delegate(object x, object y)
                        {
                            int a = 0, b = 0;
                            if (x == y) return 0;
                            if (x == null || y == null)
                                return x == null ? -1 : 1;
                            int.TryParse(x.ToString(), out a);
                            int.TryParse(y.ToString(), out b);
                            return a.CompareTo(b);
                        }
                    );

结果保存到“list”对象数组

答案 8 :(得分:0)

如果可以将ArrayList项目放入强类型容器,例如List&lt; String&gt;或者String []然后Linq可以轻松完成剩下的工作。以下实现仅解析字符串值一次,并为每个字符串创建一个匿名类型,其中包含原始字符串及其整数值。

public void Test_SortArrayList()
{
    ArrayList items = new ArrayList(new []{"1", "10", "2", "15", "17", "5", "6", "27", "8", "9"});
    string[] strings = (string[])items.ToArray(typeof(string));
    List<string> result = strings
        .Select(x => new
            {
                Original = x,
                Value = Int32.Parse(x)
            })
        .OrderBy(x => x.Value)
        .Select(x => x.Original)
        .ToList();
    result.ForEach(Console.WriteLine);
}

答案 9 :(得分:0)

按升序排列的Arraylist Sort(CaseSensitive) 对某人有帮助

class ArrayCaseSensitive:IComparer
    {
        int IComparer.Compare(object x, object y)
        {
            return (new CaseInsensitiveComparer().Compare(x,y));
        }

    public static void Main(string[] args)
    {
            IComparer sc = new ArrayCaseSensitive();
           
        ArrayList arr = new ArrayList();
        arr.Add("AB");
        arr.Add("bc");
        arr.Add("1");
        arr.Sort(sc);
        foreach(var strs in arr)
        {
            Console.WriteLine(strs);
        }
        
    }

}