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