在list中,要对一个机器名字段排序,如下格式:
“P-1,P-11,P-2,S-3,C-2,C-1”,想要得到如下格式:
“C-1,C-2,P-1,P-2,P-11,S-3”有什么好的解决办法?
有没有类似“list.Orderby(t=>int.Parse(Regex.Mash(...)))”这种做法?注:
目前的做法:对list循环遍历,重新比较之后再绑定。
“P-1,P-11,P-2,S-3,C-2,C-1”,想要得到如下格式:
“C-1,C-2,P-1,P-2,P-11,S-3”有什么好的解决办法?
有没有类似“list.Orderby(t=>int.Parse(Regex.Mash(...)))”这种做法?注:
目前的做法:对list循环遍历,重新比较之后再绑定。
如果记录非常非常多,可以先切开,再比较。
void Main()
{
string str="P-1,P-11,P-2,S-3,C-2,C-1";
var query=from s in str.Split(',')
let t=s.Split('-')
orderby t[0] , int.Parse(t[1])
select s;
query.ToList().ForEach(q=>Console.WriteLine(q));
/*
C-1
C-2
P-1
P-2
P-11
S-3 */
}
var query=str.Split(',').OrderBy(s=>s.Split('-')[0]).ThenBy(s=>int.Parse(s.Split('-')[1]));
var query=str.Split(',').OrderBy(s=>s.Split('-')[0]).ThenBy(s=>int.Parse(s.Split('-')[1]));
不行
排成“S-1, S-2, S-A, S-B”
public class CustomComparer : IComparer<string>
{
int IComparer<string>.Compare(string x, string y)
{
int result = 0;
string[] arrX = x.Split('-'), arrY = y.Split('-'); if ((result = arrX[0].CompareTo(arrY[0])) != 0)
return result; if (arrX.Length > 1 && arrY.Length > 1)
{
int tempX, tempY;
if (int.TryParse(arrX[1], out tempX) && int.TryParse(arrY[1], out tempY))
{
return tempX.CompareTo(tempY);
}
else
{
return arrX[1].CompareTo(arrY[1]);
}
}
return arrX.Length > arrY.Length ? 1 : -1;
//throw new NotImplementedException();
}
}List<string> sortList = new List<string>("P-1,S-B,P-11,P-2,S-3,S-A,C-2,C-1".Split(','));
sortList = sortList.OrderBy(a => a, new CustomComparer()).ToList(); foreach (var ss in sortList)
{
Console.WriteLine("{0}", ss);
}