私はこのような配列を持っています -
string[] input = new string[] {"bRad", "Charles", "sam", "lukE", "vIctor"}
ここで、各文字列に発生する大文字の位置に従ってこれを並べ替えたいと思いました。最初のオカレンスは、並べ替え中に考慮される唯一のオカレンスです。2 つの文字列の同じ位置に CAP がある場合、それらをアルファベット順に並べ替えます。CAP を持たない文字列にも同じことが当てはまり、アルファベット順に並べ替えます。
私がこれまでやってきたことは、十分に機能していません。私はそれを改善するために数え切れないほど試みましたが、運がありません。これがテストされる膨大な量のデータが存在するでしょう。そのため、パフォーマンスが最も重要です。.NET 2.0 を使用していますが、それ以降のバージョンは使用できません。
public static int q, p, i, s;
public static Dictionary<string, int> a = new Dictionary<string, int>();
Array.Sort(input, delegate (string x, string y) {
if (x == y)
return 0;
if (a.TryGetValue(x + "|" + y, out s))
return s;
if (a.TryGetValue(y + "|" + x, out s))
return -s;
q = x.Length;
p = y.Length;
for (i = 0; i < x.Length; i++)
{
if (x[i] < 91)
{
q = i;
break;
}
}
for (i = 0; i < y.Length; i++)
{
if (y[i] < 91)
{
p = i;
break;
}
}
if (q == x.Length && p == y.Length)
s = x.CompareTo(y);
else if (q > p)
s = 1;
else if (q < p)
s = -1;
else
s = x.CompareTo(y);
a.Add(x + "|" + y, s);
return s;
});