本帖最后由 qimeimeiqi 于 2019-10-21 15:57 编辑
灰色部分是主键,左边是第一主键,右边是第二主键
第二主键现在的排序是自然排序(eg:4,14,24)
第一主键的排序(eg:1,2,21,3,4)
private int CompareCodeMaster(Model.CodeMaster x, Model.CodeMaster y)
{
// 第一のキー(コード種別)で比較
int compareCodeType = string.Compare(x.CodeType, y.CodeType);
if (compareCodeType == 0)
{
// コード種別が同じだった場合、第二のキー(コード値)で比較する
return NaturalComparer(x.Code, y.Code);
}
else
{
// x.CodeType > y.CodeTypeもしくはx.CodeType < y.CodeTypeだった場合、比較結果をそのまま返す
return compareCodeType;
}
}
private static int NaturalComparer(string x, string y)
{
Dictionary<string, string[]> table = new Dictionary<string, string[]>();
if ((x != null) && (y != null))
{
if (x == y)
{
return 0;
}
string[] x1, y1;
if (!table.TryGetValue(x, out x1))
{
x1 = Regex.Split(x.Replace(" ", ""), "([0-9]+)");
table.Add(x, x1);
}
if (!table.TryGetValue(y, out y1))
{
y1 = Regex.Split(y.Replace(" ", ""), "([0-9]+)");
table.Add(y, y1);
}
for (int i = 0; i < x1.Length && i < y1.Length; i++)
{
if (x1 != y1)
{
return PartCompare(x1, y1);
}
}
if (y1.Length > x1.Length)
{
return 1;
}
else if (x1.Length > y1.Length)
{
return -1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
private static int PartCompare(string left, string right)
{
int x, y;
if (!int.TryParse(left, out x))
{
return left.CompareTo(right);
}
if (!int.TryParse(right, out y))
{
return left.CompareTo(right);
}
return x.CompareTo(y);
}
|