List排序问题

时间:2021-06-14 19:35:28
现有一个需求,需要对List<string>里面的Item进行排序,但是使用sort()方法排序的话,如果集合里是字符串的话可以排序成功,但如果是数字的话就无法达到预期的目的。
例如,集合是这样的:

strList = new List<string>() { 
               "1","10","11","12","13","14","15","16",
               "17","18","19","2","20","21","22","23",
               "3","4","5","6","7","8","9"
            };

使用sort()排序后是这样的顺序:1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,3,4,5,6,7,8,9 
而我想要的顺序是:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23

请问:该如何实现?

30 个解决方案

#1


自定义排序咯

#2


Sort(Int32, Int32 IComparer(T))

#3


你是字符串类型啊,当然根据字符串的规则进行排序。
sort有几个重载方法的啊,你去实现它的Icomparer方法就可以了。

#4


这个是你是字符串,所以会按ascii码来排序,如果你确认里面的元素都是是数字的,你就干脆都用int类型的吧,或者非要用字符串的话,你就补一下零就可以了,比如说1变成01

#5


给我写点代码吧,否则我还是会云里雾里的,不知道该怎么办呀

#6


该回复于2010-09-26 09:51:55被版主删除

#7


急用呀,请高手路过出手相助呀

#8


        static void Main(string[] args)
        {
            List<string> strList = new List<string>() { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" };
            strList.Sort( new Comp());

            foreach (string s in strList)
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();



        }

        private class Comp : Comparer<string>
        {

            public override int Compare(string x, string y)
            {
                return int.Parse(x) - int.Parse(y);
            }
        }

#9


List<string>  strList = new List<string>() { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" };
strList.Sort( delegate(string str1, string str2) { return int.Parse(str1) - int.Parse(str2); } );

#10


List<string> strList = new List<string>(new string[] { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" });
strList.Sort((Comparison<string>)delegate(string a, string b)
{
    return int.Parse(a).CompareTo(int.Parse(b));
});


strList 就是按你要求排序后的。vs2005起支持以上语法。更高级的vs可以用linq

#11



List<String> values = new List<string>(new String[]{
                                                      "1", "10", "11", "12", "13", "14", "15", "16",
                                                      "17", "18", "19", "2", "20", "21", "22", "23",
                                                      "3", "4", "5", "6", "7", "8", "9"});

            values.Sort(delegate(String value1, String value2) {return Int32.Parse(value1).CompareTo(Int32.Parse(value2)); });
//直接用delegate吧,如果这个IComparer不在别的地方使用

#12


这是什么东东

#13


引用 10 楼 wuyazhe 的回复:
strList 就是按你要求排序后的。vs2005起支持以上语法。更高级的vs可以用linq


饺子你来晚了,没必要转Comparison <string>的
我的代码测试通过的
匿名函数而已~

#14



Console.WriteLine(String.Join(",",values.ToArray()));
//结果:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23

#15


囧。跟同事说话,一转眼,点提交才看到。。

#16


引用楼主 qixing_gan 的回复:
现有一个需求,需要对List<string>里面的Item进行排序,但是使用sort()方法排序的话,如果集合里是字符串的话可以排序成功,但如果是数字的话就无法达到预期的目的。
例如,集合是这样的:

C# code

strList = new List <string>() {
               "1","10","11","12","13","14","15","16……


定义成strList = new List <int>() {                  1,10,11,12,13,14,15,16,                 17,18,19,2,20,21,22,23,                 3,4,5,6,7,8,9              }; 

#17


linq简单
strList = strList.OrderBy(s => int.Parse(s)).ToList();

#18


谢谢大家,方法越多越好!!

#19


出错了,
如果集合是这样的没问题:

List<String> values = new List<string>(new String[]{
                                                      "1", "10", "11", "12", "13", "14", "15", "16",
                                                      "17", "18", "19", "2", "20", "21", "22", "23",
                                                      "3", "4", "5", "6", "7", "8", "9"});



但是如果集合是这样的就会出错,该怎么解决呢?

strList = new List<string>() { 
               "abs","wds","cfs","bfe","ytd","xwz","pjg","itf"
            };

#20


int.Parse改为int.TryParse

#21


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> strList = new List<string>() { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" };
            List<int> intList = new List<int>();

            for (int i = 0; i < strList.Count; i++)
            {
                intList.Add(Convert.ToInt32(strList[i]));
            }

            for (int i = 0; i < intList.Count; i++)
            {
                for (int j = 0; i < intList.Count - j - 1; j++)
                {
                    int Temp;
                    if (intList[j] > intList[j+1])
                    {
                        Temp = intList[j];
                        intList[j] = intList[j + 1];
                        intList[j + 1] = Temp;
                    }
                }
            }

            string str = "";

            for (int i = 0; i < intList.Count; i++)
            {
                str += intList[i].ToString() + ",";
            }

            Console.Write(str.TrimEnd(','));

            Console.ReadLine();
        }
    }
}

#22


List<string> strList = new List<string>(new string[] { "1", "10", "11", "12", "abs", "wds", "cfs", "bfe", "ytd", "xwz", "pjg", "itf", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" });
strList.Sort(delegate(string a, string b)
{
    string ia = Regex.Match(a, @"\d+$").Value;
    string ib = Regex.Match(b, @"\d+$").Value;
    return (ia != "" && ib != "") ? int.Parse(a) - int.Parse(b) : string.Compare(a, b);
});

#23


如果说都是数字的话,可以按照上面的方法,将其填充到List<int>中,然后进行排序,不如不是纯数字的话,系统将会自动进行ASCII编码方式输出。

#24


List排序问题

#25


谢谢各位了,正在解决问题,稍后结贴,稍安勿躁!!!!

#26


实现一个Comparetor接口就可以了。。。

#27


打酱油

#28


为什么 return int.Parse(str1) - int.Parse(str2); 就可以排序了呢?  什么原理?

#29


lst.Sort(delegate(string s1, string  s2) { return int.Parse(str1).CompareTo(int.Parse(str1)); });

#30


我也一直对那几个接口很纠结

#1


自定义排序咯

#2


Sort(Int32, Int32 IComparer(T))

#3


你是字符串类型啊,当然根据字符串的规则进行排序。
sort有几个重载方法的啊,你去实现它的Icomparer方法就可以了。

#4


这个是你是字符串,所以会按ascii码来排序,如果你确认里面的元素都是是数字的,你就干脆都用int类型的吧,或者非要用字符串的话,你就补一下零就可以了,比如说1变成01

#5


给我写点代码吧,否则我还是会云里雾里的,不知道该怎么办呀

#6


该回复于2010-09-26 09:51:55被版主删除

#7


急用呀,请高手路过出手相助呀

#8


        static void Main(string[] args)
        {
            List<string> strList = new List<string>() { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" };
            strList.Sort( new Comp());

            foreach (string s in strList)
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();



        }

        private class Comp : Comparer<string>
        {

            public override int Compare(string x, string y)
            {
                return int.Parse(x) - int.Parse(y);
            }
        }

#9


List<string>  strList = new List<string>() { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" };
strList.Sort( delegate(string str1, string str2) { return int.Parse(str1) - int.Parse(str2); } );

#10


List<string> strList = new List<string>(new string[] { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" });
strList.Sort((Comparison<string>)delegate(string a, string b)
{
    return int.Parse(a).CompareTo(int.Parse(b));
});


strList 就是按你要求排序后的。vs2005起支持以上语法。更高级的vs可以用linq

#11



List<String> values = new List<string>(new String[]{
                                                      "1", "10", "11", "12", "13", "14", "15", "16",
                                                      "17", "18", "19", "2", "20", "21", "22", "23",
                                                      "3", "4", "5", "6", "7", "8", "9"});

            values.Sort(delegate(String value1, String value2) {return Int32.Parse(value1).CompareTo(Int32.Parse(value2)); });
//直接用delegate吧,如果这个IComparer不在别的地方使用

#12


这是什么东东

#13


引用 10 楼 wuyazhe 的回复:
strList 就是按你要求排序后的。vs2005起支持以上语法。更高级的vs可以用linq


饺子你来晚了,没必要转Comparison <string>的
我的代码测试通过的
匿名函数而已~

#14



Console.WriteLine(String.Join(",",values.ToArray()));
//结果:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23

#15


囧。跟同事说话,一转眼,点提交才看到。。

#16


引用楼主 qixing_gan 的回复:
现有一个需求,需要对List<string>里面的Item进行排序,但是使用sort()方法排序的话,如果集合里是字符串的话可以排序成功,但如果是数字的话就无法达到预期的目的。
例如,集合是这样的:

C# code

strList = new List <string>() {
               "1","10","11","12","13","14","15","16……


定义成strList = new List <int>() {                  1,10,11,12,13,14,15,16,                 17,18,19,2,20,21,22,23,                 3,4,5,6,7,8,9              }; 

#17


linq简单
strList = strList.OrderBy(s => int.Parse(s)).ToList();

#18


谢谢大家,方法越多越好!!

#19


出错了,
如果集合是这样的没问题:

List<String> values = new List<string>(new String[]{
                                                      "1", "10", "11", "12", "13", "14", "15", "16",
                                                      "17", "18", "19", "2", "20", "21", "22", "23",
                                                      "3", "4", "5", "6", "7", "8", "9"});



但是如果集合是这样的就会出错,该怎么解决呢?

strList = new List<string>() { 
               "abs","wds","cfs","bfe","ytd","xwz","pjg","itf"
            };

#20


int.Parse改为int.TryParse

#21


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> strList = new List<string>() { "1", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" };
            List<int> intList = new List<int>();

            for (int i = 0; i < strList.Count; i++)
            {
                intList.Add(Convert.ToInt32(strList[i]));
            }

            for (int i = 0; i < intList.Count; i++)
            {
                for (int j = 0; i < intList.Count - j - 1; j++)
                {
                    int Temp;
                    if (intList[j] > intList[j+1])
                    {
                        Temp = intList[j];
                        intList[j] = intList[j + 1];
                        intList[j + 1] = Temp;
                    }
                }
            }

            string str = "";

            for (int i = 0; i < intList.Count; i++)
            {
                str += intList[i].ToString() + ",";
            }

            Console.Write(str.TrimEnd(','));

            Console.ReadLine();
        }
    }
}

#22


List<string> strList = new List<string>(new string[] { "1", "10", "11", "12", "abs", "wds", "cfs", "bfe", "ytd", "xwz", "pjg", "itf", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", "22", "23", "3", "4", "5", "6", "7", "8", "9" });
strList.Sort(delegate(string a, string b)
{
    string ia = Regex.Match(a, @"\d+$").Value;
    string ib = Regex.Match(b, @"\d+$").Value;
    return (ia != "" && ib != "") ? int.Parse(a) - int.Parse(b) : string.Compare(a, b);
});

#23


如果说都是数字的话,可以按照上面的方法,将其填充到List<int>中,然后进行排序,不如不是纯数字的话,系统将会自动进行ASCII编码方式输出。

#24


List排序问题

#25


谢谢各位了,正在解决问题,稍后结贴,稍安勿躁!!!!

#26


实现一个Comparetor接口就可以了。。。

#27


打酱油

#28


为什么 return int.Parse(str1) - int.Parse(str2); 就可以排序了呢?  什么原理?

#29


lst.Sort(delegate(string s1, string  s2) { return int.Parse(str1).CompareTo(int.Parse(str1)); });

#30


我也一直对那几个接口很纠结