我在csv文件(OID,SN)中有一个很长的订单in列表,后面是它们的序列号。我需要按序列号对列表进行排序,它使用base58,因此大写字母排在小写字母之前。
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz :Base58
只是在做
IEnumerable<string> query =
from line in serialNumbers
let x = line.split(',')
orderby x[1]
select x[0] + "," + x[1];
string[] temp = query.ToArray();
按字母顺序排序,但不是按Base58顺序排序。我该如何做到这一点?使用C#。
发布于 2014-02-07 16:24:16
您可以定义自定义比较器,例如:
class Base58Comparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (object.ReferenceEquals(x, y))
return 0;
if (object.ReferenceEquals(x, null))
return -1;
if (object.ReferenceEquals(y, null))
return 1;
int minLen = Math.Min(x.Length, y.Length);
for (int i = 0; i < minLen; i++)
{
// comparison based on ASCII value
int comp = x[i].CompareTo(y[i]);
if (comp != 0)
return comp;
}
return x.Length - y.Length;
}
}
然后您可以将其传递给OrderBy
方法,例如:
var query = serialNumbers.Select(line => line.Split(','))
.OrderBy(x => x[1], new Base58Comparer())
.Select(x => x[0] + "," + x[1]);
https://stackoverflow.com/questions/21621943
复制相似问题