对每个字符串的一部分(由字符分隔)上的字符串数组列表进行排序

本文关键字:字符串 数组 列表 排序 字符 一部分 分隔 | 更新日期: 2023-09-27 18:18:25

我正在尝试对 string s 的ArrayList进行排序(不是在 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();
    }
}

对每个字符串的一部分(由字符分隔)上的字符串数组列表进行排序

我不是 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);

在 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
}

以下代码在类上实现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()来实现所需的订单。

最简单的方法是离开你的非泛型列表:

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