Если вы хотите немного изменить свой класс, следуйте этому пути!.
Вы можете иметь 12 свойств и отображать их в один массив целых чисел. Итак, у вас есть массив целых чисел длиной 12. когда intArray[0] = 1
означает, что доступен первый месяц. если intArray[0] = 0
означает, что первый месяц недоступен и так далее.
Вы конвертируете этот массив int в строку с представлением base-16 индекса каждого месяца, основанного на 1, но если он недоступен, вместо этого поставьте 0. Позже мы воспользуемся словарем, чтобы получить название месяца, указав вместо него его номер.
Пример 1:
"003456000a00"
Это означает, что доступны месяцы 3th,4th,5th,6th
и a = 10th
. затем используйте регулярное выражение, чтобы проанализировать это и найти совпадения. Шаблон регулярного выражения будет [^0]+
. означает, что он соответствует любому символу, кроме 0
.
Таким образом, регулярное выражение даст нам эти совпадения.
Match 1 : 3456
Match 2 : a
Длина первого совпадения больше 1
означает диапазон месяцев. поэтому мы берем первый символ и последний. и мы присоединяемся к ним с -
. Здесь это будут 3
и 6
. Итак, совпадение 1 должно стать
Mar-Jun
Длина второго совпадения всего 1
означает, что это один месяц. Так должно стать
Oct
Поскольку у нас есть два совпадения, мы соединяем их с помощью ,
, и, наконец, на выходе получается Mar-Jun , Oct
.
Пример 2:
"020000000000"
Спички
Match 1 : 2
Поскольку у нас есть только 1 совпадение, а длина совпадения равна 1, это должно стать
Feb Only
Пример 3:
"023456780000"
Спички
Match 1 : 234567
Это только одно совпадение, но длина этого совпадения больше одного. поэтому мы просто берем 2
и 7
и присоединяем к ним -
.
Feb-Jul
Пример 4:
"123456789abc"
Спички
Match 1 : 123456789abc
Как видите, у нас есть все месяцы. длина этого совпадения 12, так что должно быть
Year round
Пример 5:
"123456000abc"
Спички
Match 1 : 123456
Match 2 : abc
Здесь у нас есть два матча. это может быть Jan-Jun , Oct-Dec
, но лучшее представление (как вы упомянули в комментарии) - Oct-Jun
. Это должно быть abc123456
. Итак, мы проверяем, заканчивается ли последнее совпадение на c
, а первое совпадение начинается на 1
, затем мы соединяем последнее совпадение с первым совпадением.
Oct-Jun
Код:
Это станет просто, как вы можете видеть.
internal class AvailableYear
{
private readonly int[] _available;
private static readonly Regex MatchTrue = new Regex("[^0]+");
private static readonly Dictionary<string, string> GetName = new Dictionary<string, string>
{
{"1","Jan" },
{"2","Feb" },
{"3","Mar" },
{"4","Apr" },
{"5","May" },
{"6","Jun" },
{"7","Jul" },
{"8","Aug" },
{"9","Sep" },
{"a","Oct" },
{"b","Nov" },
{"c","Dec" },
};
public AvailableYear(params int[] available)
{
if (available.Length > 12) throw new IndexOutOfRangeException("given parameters should not exceed 12 months.");
_available = available;
}
public int AvaialableJan
{
get { return _available[0]; }
set { _available[0] = value; }
}
public int AvailableFeb
{
get { return _available[1]; }
set { _available[1] = value; }
}
public int AvailableMar
{
get { return _available[2]; }
set { _available[2] = value; }
}
public int AvailableApr
{
get { return _available[3]; }
set { _available[3] = value; }
}
public int AvaialableMay
{
get { return _available[4]; }
set { _available[4] = value; }
}
public int AvaialableJun
{
get { return _available[5]; }
set { _available[5] = value; }
}
public int AvaialableJul
{
get { return _available[6]; }
set { _available[6] = value; }
}
public int AvaialableAug
{
get { return _available[7]; }
set { _available[7] = value; }
}
public int AvaialableSep
{
get { return _available[8]; }
set { _available[8] = value; }
}
public int AvaialableOct
{
get { return _available[9]; }
set { _available[9] = value; }
}
public int AvaialableNov
{
get { return _available[10]; }
set { _available[10] = value; }
}
public int AvaialableDec
{
get { return _available[11]; }
set { _available[11] = value; }
}
public override string ToString()
{
string values = string.Join("", _available.Select((x, i) => x == 0 ? "0" : Convert.ToString(i + 1, 16)));
var matches = MatchTrue.Matches(values).Cast<Match>().Select(x => x.Value).ToList();
if (matches.Count == 0)
{
return "None";
}
if (matches[0].Length == 12)
{
return "Year round";
}
if (matches.Count == 1 && matches[0].Length == 1)
{
return GetName[matches[0]] + " Only";
}
else
{
if (matches.First().StartsWith("1") && matches.Last().EndsWith("c"))
{
matches[0] = matches.Last() + matches.First();
matches.RemoveAt(matches.Count - 1);
}
List<string> output = new List<string>();
foreach (var match in matches)
{
if (match.Length == 1)
{
output.Add(GetName[match]);
}
else
{
output.Add(GetName[match.First().ToString()] + "-" +
GetName[match.Last().ToString()]);
}
}
return string.Join(", ", output);
}
}
}
Вот тест.
static void Main()
{
AvailableYear ay = new AvailableYear(1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0);
Console.WriteLine(ay.ToString());
// Output : Jan , Apr-Jul , Nov
}
Обновление:
Если вы хотите присвоить логические значения в конструкторе, вы можете изменить конструктор на это.
public AvailableYear(params bool[] available)
{
if (available.Length > 12) throw new IndexOutOfRangeException("given parameters should not exceed 12 months.");
_available = available.Select(Convert.ToInt32).ToArray();
}
И создайте такой экземпляр. без написания Convert.ToInt32 каждый раз.
return new AvailableYear(AvailableJan, AvailableFeb, AvailableMar...., AvailableDec).ToString();
person
M.kazem Akhgary
schedule
15.11.2015
Feb
,May
,Sep
? - person poke   schedule 15.11.2015Feb
,May
другой толькоSep
? - person BendEg   schedule 15.11.2015Feb
иMay-Sep
? - person poke   schedule 15.11.2015