在每个字符串的一部分上对字符串的Arraylist进行排序,由字符分隔

时间:2014-08-17 10:53:44

标签: c# string sorting arraylist

我正在尝试对ArrayListstring进行排序(不在int中)。

给定: f.e。

[0] 23,24
[1] 12,33
[2] 37,11

Arraylist.Sort应该回馈(按最后一个数字升序排序):

[0] 37,11
[1] 23,24
[2] 12,33

到目前为止:

public class Point
{
    public int i, j;

    public Point(int i, int j)
    {this.i = i; this.j = j;}

    public string ToString()
    {return i + "," + j;}
}

public class SList
{
    public static void Main()
    {
        ArrayList Slist = new ArrayList();
        Random Generate = new Random();
        for (int i = 0; i < 3; i++)
        {
            Point p = new Point(Generate.Next(40), Generate.Next(40));
            Slist.Add(p.ToString());
        }
        Slist.Sort();
    }
}

4 个答案:

答案 0 :(得分:0)

在c#1.0之后使用ArrayList的奇数排序,但如果你有一个遗留原因,你可以创建自己的非通用自定义比较器,如下所示:

public class CustomComparer : IComparer<string>, IComparer {

    #region IComparer<string> Members

    int? ExtractNumber(string str)
    {
        int index = str.LastIndexOf(',');
        if (index < 0)
            return null;
        var subStr = str.Substring(index+1);
        int result;
        if (int.TryParse(subStr, out result))
            return result;
        return null;
    }

    // Return x - y
    public int Compare(string x, string y)
    {
#if false
        Given: f.e.
        [0] 23,24
        [1] 12,33
        [2] 37,11
        Arraylist.Sort should give back (sorted by the last number ascending):
        [0] 37,11
        [1] 23,24
        [2] 12,33
#endif
        var xVal = ExtractNumber(x);
        var yVal = ExtractNumber(y);
        if (!xVal.HasValue && !yVal.HasValue)
            return x.CompareTo(y);
        else if (!xVal.HasValue)
            return 1;
        else if (!yVal.HasValue)
            return -1;
        int cmp = xVal.Value.CompareTo(yVal.Value);
        if (cmp != 0)
            return cmp;
        return x.CompareTo(y);
    }

    #endregion

    #region IComparer Members

    public int Compare(object x, object y)
    {
        if (object.ReferenceEquals(x, y))
            return 0;
        string xStr = x as string;
        string yStr = y as string;
        if (xStr == null && yStr == null)
            return 0;  // NO IDEA
        else if (xStr == null)
            return 1;
        else if (yStr == null)
            return -1;
        else return Compare(xStr, yStr);
    }

    #endregion
}

答案 1 :(得分:0)

以下代码在您的类上实现IComparable。它按升序对y进行排序:

public class Point : IComparable<Point>
{
    public int x;
    public int y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public string ToString()
    {
        return x + "," + y;
    }

    public int CompareTo(Point other)
    {
         return this.y.CompareTo(other.y);
    }

}

您现在可以使用ArrayList.Sort()来获得所需的订单。

答案 2 :(得分:0)

最简单的方法是退出非通用列表:

var sortedList = list.Cast<string>().OrderBy(x => x.Split(',')[1]);

代码不言自明。

将此作为输入:

var list = new ArrayList();
list.Add("23,24");
list.Add("12,33");
list.Add("37,11");

将此产量作为输出:

  

37,11
  23,24
  12,33

答案 3 :(得分:0)

我不是100%确定你是否有一个字符串数组或者它们是否已被拆分,但你可以创建一个自定义比较器并做一些这样的事情。更清楚你想要什么,这样人们可以更好地帮助你。

    public class MyCustomComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            var xIntValues = x.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
            var yIntValues = y.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();

            for(var i = 0; i < Math.Min(xIntValues.Count(), yIntValues.Count()); ++i)
                if (xIntValues[i] != yIntValues[i])
                    return xIntValues[i] - yIntValues[i];
            return xIntValues.Count() - yIntValues.Count();
        }
    }

然后像这样使用它,你的数组元素包含像"37, 11"

这样的字符串
    Array.Sort(myArray, MyCustomComparer);