文字列形式を "h:m:s:f"からなるTimeSpan
の文字列形式を生成しようとしています(時、分、秒の場合は最大2桁、0ミリ秒間は3桁です。時間軸の可能なすべての文字列時間形式を生成する
所望のフォーマット
HH:M:SS:MM:S
HH:MM:SS
H:M:S:
FF時間FFF
など。
私は次の操作を実行しようとした再帰を使用しますが、私はそうするのに苦労してることをやろうとしている:
//Key - minimum digits left
//Value starting digits count
private static Dictionary<char, KeyValuePair<int, int>> replacements =
new Dictionary<char, KeyValuePair<int, int>>
{
['f'] = new KeyValuePair<int, int>(0, 3),
['s'] = new KeyValuePair<int, int>(1, 2),
['m'] = new KeyValuePair<int, int>(1, 2),
['h'] = new KeyValuePair<int, int>(1, 2)
};
private static char[] chars = new[] { 'f', 's', 'm', 'h' };
private static string baseTemplate = @"hh\:mm\:ss\:fff";
static IEnumerable<string> GetFormats(string template, int startIndex = 0, int endIndex = 0, List<string> formats = null)
{
if (formats == null)
{
formats = new List<string>{template};
}
string copyTemplate = template;
char currentChar = chars[startIndex];
int indexToRemove = copyTemplate.IndexOf(currentChar);
for (int i = 0; i < replacements[currentChar].Value - replacements[currentChar].Key; i++)
{
copyTemplate = copyTemplate.Remove(indexToRemove, 1);
formats.Add(copyTemplate.TrimEnd('\\', '.', ':'));
}
if (startIndex == chars.Length - 1 && endIndex == chars.Length - 1)
{
return formats;
}
if (startIndex == 0)
{
return GetFormats(baseTemplate, endIndex + 1, endIndex + 1, formats);
}
return GetFormats(copyTemplate, startIndex - 1, endIndex, formats);
}
しかし、それが動作しているようですしない、私も作業を持っています基本的にループに使用して強引なソリューションであるバージョン:
private static List<string> GetFormats(List<string> separators)
{
List<string> formats = new List<string>();
for (int i = 0; i < separators.Count; i++)
{
string format = string.Empty;
for (int hours = 1; hours <= 2; hours++)
{
format += "h";
string hoursCopy = format;
format += @"\:";
for (int minutes = 1; minutes <= 2; minutes++)
{
format += "m";
string minutesCopy = format;
format += @"\:";
for (int seconds = 1; seconds <= 2; seconds++)
{
format += "s";
string secondsCopy = format;
format += [email protected]"\{separators[i]}";
for (int miliseconds = 0; miliseconds <= 3; miliseconds++)
{
formats.Add(format.TrimEnd('\\', '.', ':'));
format += "f";
}
format = secondsCopy;
}
format = minutesCopy;
}
format = hoursCopy;
}
}
return formats;
}
呼び出し:
GetFormats(new[] { ":" })
再帰メソッドを修正するにはどうすればよいですか?
@mjwills私は、h、m:s:fで構成され、時間、分、秒で最大2桁、ミリ秒で0-3桁の制約*を含んでいます。これを行うと、 'TimeSpan.ParseExact'に一連のフォーマットを渡すことができます。現在のバージョンではすべての組み合わせが印刷されていませんが、ほとんどが欠落しています。 – Deadzone
'System.Globalization.DateTimeFormatinfo.GetAllDateTimePatterns()'がより良い開始点になるかもしれません – Plutonix
@Plutonixそれはかなり便利なはずですが、もっと簡単な方法があるはずだと思っていましたが、それでもやりたいことがあります。 – Deadzone