public void WorkWithTimephasedDataCollection()
        {
            // ExStart
            // ExFor: TimephasedDataCollection
            // ExFor: TimephasedDataCollection.#ctor
            // ExFor: TimephasedDataCollection.Add(TimephasedData)
            // ExFor: TimephasedDataCollection.AddRange(IEnumerable{Aspose.Tasks.TimephasedData})
            // ExFor: TimephasedDataCollection.Clear
            // ExFor: TimephasedDataCollection.Contains(TimephasedData)
            // ExFor: TimephasedDataCollection.CopyTo(TimephasedData[],Int32)
            // ExFor: TimephasedDataCollection.Count
            // ExFor: TimephasedDataCollection.GetEnumerator
            // ExFor: TimephasedDataCollection.IsReadOnly
            // ExFor: TimephasedDataCollection.Remove(TimephasedData)
            // ExFor: TimephasedDataCollection.SelectBetweenStartAndFinish(TimephasedDataType,DateTime,DateTime)
            // ExFor: TimephasedDataCollection.ToList
            // ExSummary: Shows how to work with timephased data collections.
            var project = new Project(DataDir + "Project1.mpp");

            var resource = project.Resources.Add("Resource 1");

            resource.Set(Rsc.Type, ResourceType.Work);

            var resource2 = project.Resources.Add("Resource 2");

            resource2.Set(Rsc.Type, ResourceType.Work);

            var task = project.RootTask.Children.Add("Task 1");

            task.Set(Tsk.Start, new DateTime(2019, 11, 11, 8, 0, 0));
            task.Set(Tsk.Duration, project.GetDuration(24, TimeUnitType.Hour));
            task.Set(Tsk.Work, project.GetDuration(3d, TimeUnitType.Hour));
            task.Set(Tsk.Finish, new DateTime(2019, 11, 13, 17, 0, 0));

            var task2 = project.RootTask.Children.Add("Task 2");

            task2.Set(Tsk.Start, new DateTime(2019, 11, 11, 8, 0, 0));
            task2.Set(Tsk.Duration, project.GetDuration(24, TimeUnitType.Hour));
            task2.Set(Tsk.Work, project.GetDuration(3d, TimeUnitType.Hour));
            task2.Set(Tsk.Finish, new DateTime(2019, 11, 13, 17, 0, 0));

            var assignment = project.ResourceAssignments.Add(task, resource);

            assignment.Set(Asn.Start, new DateTime(2019, 11, 11, 8, 0, 0));
            assignment.Set(Asn.Work, project.GetDuration(3, TimeUnitType.Hour));
            assignment.Set(Asn.Finish, new DateTime(2019, 11, 13, 17, 0, 0));

            var assignment2 = project.ResourceAssignments.Add(task2, resource2);

            assignment2.Set(Asn.Start, new DateTime(2019, 11, 11, 8, 0, 0));
            assignment2.Set(Asn.Work, project.GetDuration(3, TimeUnitType.Hour));
            assignment2.Set(Asn.Finish, new DateTime(2019, 11, 13, 17, 0, 0));

            // set contoured work contour
            assignment.Set(Asn.WorkContour, WorkContourType.Contoured);

            Console.WriteLine("Is timephased data collection read-only?: " + assignment.TimephasedData.IsReadOnly);

            // clear generated tds
            assignment.TimephasedData.Clear();

            var td = new TimephasedData
            {
                Start              = new DateTime(2019, 11, 11, 8, 0, 0),
                Finish             = new DateTime(2019, 11, 11, 9, 0, 0),
                Uid                = assignment.Get(Asn.Uid),
                Unit               = TimeUnitType.Hour,
                Value              = "PT1H0M0S",
                TimephasedDataType = TimephasedDataType.AssignmentRemainingWork
            };

            assignment.TimephasedData.Add(td);

            var list = new List <TimephasedData>();
            var td2  = new TimephasedData
            {
                Start              = new DateTime(2019, 11, 12, 8, 0, 0),
                Finish             = new DateTime(2019, 11, 12, 9, 0, 0),
                Uid                = assignment.Get(Asn.Uid),
                Unit               = TimeUnitType.Hour,
                Value              = "PT1H0M0S",
                TimephasedDataType = TimephasedDataType.AssignmentRemainingWork
            };
            var td3 = new TimephasedData
            {
                Start              = new DateTime(2019, 11, 13, 8, 0, 0),
                Finish             = new DateTime(2019, 11, 13, 9, 0, 0),
                Uid                = assignment.Get(Asn.Uid),
                Unit               = TimeUnitType.Hour,
                Value              = "PT1H0M0S",
                TimephasedDataType = TimephasedDataType.AssignmentRemainingWork
            };

            list.Add(td2);
            list.Add(td3);
            assignment.TimephasedData.AddRange(list);

            // one can filter the collection by type and date range
            Console.WriteLine("Print filtered tds:");
            IList <TimephasedData> filteredTds = assignment.TimephasedData.SelectBetweenStartAndFinish(
                TimephasedDataType.AssignmentRemainingWork,
                new DateTime(2019, 11, 11, 0, 0, 0),
                new DateTime(2019, 11, 13));

            Assert.AreEqual(2, filteredTds.Count); // ExSkip
            foreach (var data in filteredTds)
            {
                Console.WriteLine("Start: " + data.Start);
                Console.WriteLine("Finish: " + data.Finish);
                Console.WriteLine("Timephased Data Type: " + data.TimephasedDataType);
                Console.WriteLine();
            }

            Console.WriteLine("--------------------------");
            Console.WriteLine();

            // ...
            // add a wrong td and then delete it
            var td4 = new TimephasedData
            {
                Start              = new DateTime(2019, 11, 13, 8, 0, 0),
                Finish             = new DateTime(2019, 11, 13, 9, 0, 0),
                Uid                = assignment.Get(Asn.Uid),
                Unit               = TimeUnitType.Hour,
                Value              = "PT0H0M1S",  // wrong value
                TimephasedDataType = TimephasedDataType.AssignmentRemainingWork
            };

            assignment.TimephasedData.Add(td4);

            // ...

            // delete the wrong td item
            if (assignment.TimephasedData.Contains(td4))
            {
                assignment.TimephasedData.Remove(td4);
            }

            // ...
            assignment.TimephasedData.AddRange(list);

            // iterate over timephased items
            Console.WriteLine("Print all timephased items:");
            Console.WriteLine("Timephased data count: " + assignment.TimephasedData.Count);
            foreach (var item in assignment.TimephasedData)
            {
                Console.WriteLine("Start: " + item.Start);
                Console.WriteLine("Finish: " + item.Finish);
                Console.WriteLine("Timephased Data Type: " + item.TimephasedDataType);
                Console.WriteLine();
            }

            // copy tds to another assignment
            var timephasedDatas = new TimephasedData[assignment.TimephasedData.Count];

            assignment.TimephasedData.CopyTo(timephasedDatas, 0);

            assignment2.TimephasedData.Clear();
            foreach (var data in timephasedDatas)
            {
                assignment2.TimephasedData.Add(data);
            }

            // the collection can be converted to a plain list
            List <TimephasedData> tds = assignment.TimephasedData.ToList();

            // lets remove tds one by one
            foreach (var timephasedData in tds)
            {
                assignment.TimephasedData.Remove(timephasedData);
            }

            // ExEnd
        }
        public void WorkWithTimephasedData()
        {
            // ExStart
            // ExFor: TimephasedData
            // ExFor: TimephasedData.#ctor
            // ExFor: TimephasedData.CreateCostTimephased(Int32,DateTime,DateTime,Double,TimeUnitType,TimephasedDataType)
            // ExFor: TimephasedData.CreateUnitTimephased(Int32,DateTime,DateTime,Double,TimephasedDataType)
            // ExFor: TimephasedData.CreateWorkTimephased(Int32,DateTime,DateTime,TimeSpan,TimeUnitType,TimephasedDataType)
            // ExFor: TimephasedData.Finish
            // ExFor: TimephasedData.Start
            // ExFor: TimephasedData.TimephasedDataType
            // ExFor: TimephasedData.Uid
            // ExFor: TimephasedData.Unit
            // ExFor: TimephasedData.Value
            // ExFor: TimephasedData.ValueToCost
            // ExFor: TimephasedData.ValueToDuration
            // ExFor: TimephasedData.ValueToUnits
            // ExFor: TimephasedDataType
            // ExSummary: Shows how to work with custom timephased data.
            var project = new Project(DataDir + "Project1.mpp")
            {
                CalculationMode = CalculationMode.None
            };

            var workResource = project.Resources.Add("Work Resource");

            workResource.Set(Rsc.Type, ResourceType.Work);
            var costResource = project.Resources.Add("Cost Resource");

            costResource.Set(Rsc.Type, ResourceType.Cost);

            var task = project.RootTask.Children.Add("Task");

            task.Set(Tsk.Start, new DateTime(2018, 1, 1, 8, 0, 0));
            task.Set(Tsk.Duration, project.GetDuration(1, TimeUnitType.Day));

            var workAssignment = project.ResourceAssignments.Add(task, workResource);

            workAssignment.Set(Asn.WorkContour, WorkContourType.Contoured);
            var costAssignment = project.ResourceAssignments.Add(task, costResource);

            costAssignment.Set(Asn.WorkContour, WorkContourType.Contoured);

            // lets add custom timephased tds
            workAssignment.TimephasedData.Clear();

            // add work days
            var td1 = TimephasedData.CreateWorkTimephased(
                workAssignment.Get(Asn.Uid),
                new DateTime(2018, 1, 2, 8, 0, 0),
                new DateTime(2018, 1, 5, 17, 0, 0),
                TimeSpan.FromHours(40),
                TimeUnitType.Hour,
                TimephasedDataType.AssignmentRemainingWork);

            // add weekend
            var td2 = TimephasedData.CreateWorkTimephased(
                workAssignment.Get(Asn.Uid),
                new DateTime(2018, 1, 6, 8, 0, 0),
                new DateTime(2018, 1, 8, 8, 0, 0),
                TimeSpan.Zero,
                TimeUnitType.Hour,
                TimephasedDataType.AssignmentRemainingWork);

            workAssignment.TimephasedData.Add(td1);
            workAssignment.TimephasedData.Add(td2);

            costAssignment.TimephasedData.Clear();

            // add work days
            var td11 = TimephasedData.CreateCostTimephased(
                costAssignment.Get(Asn.Uid),
                new DateTime(2018, 1, 2, 8, 0, 0),
                new DateTime(2018, 1, 5, 17, 0, 0),
                1,
                TimeUnitType.Hour,
                TimephasedDataType.AssignmentCost);

            // add weekend
            var td22 = TimephasedData.CreateCostTimephased(
                costAssignment.Get(Asn.Uid),
                new DateTime(2018, 1, 6, 8, 0, 0),
                new DateTime(2018, 1, 8, 8, 0, 0),
                0,
                TimeUnitType.Hour,
                TimephasedDataType.AssignmentCost);

            costAssignment.TimephasedData.Add(td11);
            costAssignment.TimephasedData.Add(td22);

            Console.WriteLine("Print assignment timephased data:");
            foreach (var assignment in project.ResourceAssignments)
            {
                Console.WriteLine("Assignment UID: " + assignment.Get(Asn.Uid));
                foreach (var tds in assignment.TimephasedData)
                {
                    Console.WriteLine("  Uid: " + tds.Uid);
                    Console.WriteLine("  Start: " + tds.Start);
                    Console.WriteLine("  Finish: " + tds.Finish);
                    Console.WriteLine("  Type: " + tds.TimephasedDataType);
                    Console.WriteLine("  Unit: " + tds.Unit);
                    Console.WriteLine("  Value: " + tds.Value);
                    Console.WriteLine("  ValueToCost: " + tds.ValueToCost);
                    Console.WriteLine("  ValueToDuration: " + tds.ValueToDuration);
                    Console.WriteLine("  ValueToUnits: " + tds.ValueToUnits);
                    Console.WriteLine();
                }
            }

            project.Recalculate();

            // ExEnd
        }