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

C# 如何在C语言中对数组列表的元素进行排序#,c#,C#,我有一个ArrayList,它包含 [0] = "1" [1] = "10" [2] = "2" [3] = "15" [4] = "17" [5] = "5" [6] = "6" [7] = "27" [8] = "8" [9] = "9" object[] list = aryList.ToArray(); Array.Sort<object> (

我有一个ArrayList,它包含

[0] = "1"
[1] = "10"
[2] = "2"
[3] = "15"
[4] = "17"
[5] = "5"
[6] = "6"
[7] = "27"
[8] = "8"
[9] = "9"
                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);
                        }
                    );
现在我需要对数组列表进行排序,使其成为

[0] = "1"
[1] = "2"
[2] = "5"
[3] = "6"
[4] = "8"
[5] = "9"
[6] = "10"
[7] = "15"
[8] = "17"
[9] = "27"
                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);
                        }
                    );

最后,我将从ArrayList中获取值,并将它们用作'int'值。我该怎么做?或者首先将它们转换为int,然后对它们进行排序。

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

                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);
                        }
                    );
尝试以下方法(为了简洁起见,省略了一些参数检查)

                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);
                        }
                    );
公共类数值比较器:IComparer{
公共整数比较(对象x、对象y){
字符串左=(字符串)x;
字符串右=(字符串)y;
int max=Math.Min(left.Length,right.Length);
对于(int i=0;i
也许您可以将这些值存储在一个强类型的列表中,比如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());
        }
                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 intList=newlist(newint[]{3,2,1});
intList.Sort();
foreach(intList中的int)
{
System.Diagnostics.Debug.WriteLine(theInt.ToString());
}

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

如果您可以确定列表中只包含可以转换为整数的字符串,那么使用扩展方法,尝试以下操作:

var sortedList = list.OrderBy(item => int.Parse(item));
                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);
                        }
                    );
如果您使用的是
ArrayList
而不是
列表
(boo!),则首先需要
强制转换

var sortedList = list.Cast<string>().OrderBy(item => int.Parse(item));
                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);
                        }
                    );
var sortedList=list.Cast().OrderBy(item=>int.Parse(item));

正如JaredPar所指出的,您也可以定义自己的比较器,但是对于已经实现的东西来说,这需要做很多工作。但是,它更高效。

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

                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);
                        }
                    );
完整代码:

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));
        }
    }
}
                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);
                        }
                    );
输出:

                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);
                        }
                    );
一, 2. 3. 12 13
25

如果值都是整数,为什么不将它们存储为整数?这将使分类更容易、更快

                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);
                        }
                    );
这些值还有哪些其他用途?如果它们只作为字符串使用,并且只排序一次,那么将它们保留为字符串可能是明智的

                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);
                        }
                    );
另一方面,如果它们用于数学运算,那么最好将它们存储为int。

List liDllCnt=new List();
 List<int> liDllCnt = new List<int>();
 for (int temp = 0; temp < alFileName.Count; temp++)
     liDllCnt.Add(Int32.Parse(alFileName[temp].ToString()));
 liDllCnt.Sort();
                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);
                        }
                    );
对于(int-temp=0;temp

alFileName是我使用的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);
                        }
                    );
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);
                        }
                    );
object[]list=aryList.ToArray();
数组,排序
(
列表
委托(对象x、对象y)
{
int a=0,b=0;
如果(x==y)返回0;
如果(x==null | | y==null)
返回x==null?-1:1;
int.TryParse(x.ToString(),out a);
int.TryParse(y.ToString(),out b);
返回a.CompareTo(b);
}
);

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

如果可以将ArrayList项放入强类型容器(如list或String[]),则Linq可以轻松完成其余操作。下面的实现只解析字符串值一次,并使用原始字符串及其整数值为每个字符串创建一个匿名类型

                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);
                        }
                    );
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);
}
public void Test\u SortArrayList()
{
ArrayList项=新的ArrayList(新[]{“1”、“10”、“2”、“15”、“17”、“5”、“6”、“27”、“8”、“9”);
string[]strings=(string[])items.ToArray(typeof(string));
列表结果=字符串
.选择(x=>new
{
原始=x,
Value=Int32.Parse(x)
})
.OrderBy(x=>x.Value)
.选择(x=>x.Original)
.ToList();
result.ForEach(Console.WriteLine);
}
按升序排列的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);
                        }
                    );
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);
        }
        
    }

}

为什么还要像字符串一样比较呢?它们都是数字??将它们解析为int并返回结果不容易吗?他会说这样做效率较低way@gbianchi“肖恩是对的。我之所以进行字符比较,是因为这样做比解析成数字并进行比较要有效得多。解析成数字效果很好,但它与进行字符比较有明显的性能差异是的,逐字符比较字符串更有效。但可读性较差!;)您说过,带有if的for调用math.min并重新转换为string是一个speeder,它只是一个解析?我真的需要试试。。。此外,如果您的数字更大,则性能更高?您使用的是什么版本的C#?什么版本的VisualStudio?如果您没有使用.NET1.1,那么就不应该使用ArrayList。相反,您应该使用列表。在您的情况下,这看起来像一个列表。这不起作用。OP正在使用ArrayList。你至少需要一个.Cast。而且似乎需要Linq。这是你的解决方案吗?那么你真的需要将数据存储为int。我认为这对于用户想要的东西来说有点复杂,但我认为它会起作用。它肯定会起作用。还有一个客户比较器