Один из приемов, который мы можем использовать, - это иметь один l oop, который находит соответствующий элемент в конце списка на основе текущего индекса. Мы можем сделать это так:
for (int i = 0; i < activities.Count; i++)
var correspondingIndex = activities.Count - i - 1;
Обратите внимание, что:
- Когда
i
равно 0
, correspondingIndex
- это последний индекс в массиве. - Когда
i
равно 1
, correspondingIndex
- предпоследний индекс в массиве. - Когда
i
- activities.Count - 1
(последний индекс), correspondingIndex
is 0
Используя этот трюк, мы можем получить соответствующие разницы во времени одновременно с заполнением нового списка Activity
объектов.
Надеюсь, этот код сделает это немного яснее:
public static IList<Activity> ReverseActivities(IList<Activity> activities)
{
// If activities is null or contains less than 2 items, return it
if ((activities?.Count ?? 0) < 2) return activities;
// This will contain the reversed list
var reversed = new List<Activity>();
for (int i = 0; i < activities.Count; i++)
{
// Get the corresponding index from the end of the list
var correspondingIndex = activities.Count - i - 1;
// Get the timespan from the corresponding items from the end of the list
var timeSpan = i == 0
? TimeSpan.Zero
: activities[correspondingIndex + 1].TimeOfDay -
activities[correspondingIndex].TimeOfDay;
// The new TimeOfDay will be the previous item's TimeOfDay plus the TimeSpan above
var timeOfDay = i == 0
? activities[i].TimeOfDay
: reversed[i - 1].TimeOfDay + timeSpan;
reversed.Add(new Activity(activities[correspondingIndex].Name, timeOfDay));
}
return reversed;
}
При использовании это будет выглядеть так:
var original = new List<Activity>
{
new Activity("A", new TimeSpan(0, 12, 0)),
new Activity("B", new TimeSpan(0, 12, 15)),
new Activity("C", new TimeSpan(0, 12, 40)),
new Activity("D", new TimeSpan(0, 13, 40))
};
var reversed = ReverseActivities(original);
Вот результат в окне отладки (сравните original
и reversed
):