user1264626
user1264626

Reputation: 87

c# add to list<DateCount> - DateTime Best way

I have a list of dates (currently there are 4000 in the selected result) I am trying to put the results in a chart,

The Class looks like this

public class DisplayObjectDates
{
    public int Month { get; set; }
    public int Year { get; set; }
    public int day { get; set; }
    public DateTime fulldatetime { get; set; }
    public int CountedDate { get; set; }
}

I have a list of the class

private static List<DisplayObjectDates> SortedDatesDays = new List<DisplayObjectDates>();

and I add to the list like this after calling from EF and getting a returned list

if (SortedDatesDays.Count() == 0)
                {
                    var addDisplayObjectDatesYear = new DisplayObjectDates();
                    addDisplayObjectDatesYear.Year = contextreturned.change_time.Year;
                    addDisplayObjectDatesYear.Month = contextreturned.change_time.Month;
                    addDisplayObjectDatesYear.day = contextreturned.change_time.Day;
                    addDisplayObjectDatesYear.fulldatetime = contextreturned.change_time;
                    addDisplayObjectDatesYear.CountedDate = 1;
                    SortedDatesDays.Add(addDisplayObjectDatesYear);
                }
                else
                {
                    foreach (var VARIABLE in SortedDatesDays)
                    {
                        if (VARIABLE.day == contextreturned.change_time.Day && VARIABLE.Month == contextreturned.change_time.Month && VARIABLE.Year == contextreturned.change_time.Year)
                        {
                            VARIABLE.CountedDate = VARIABLE.CountedDate++;
                        }
                        else
                        {
                            var addDisplayObjectDatesYear = new DisplayObjectDates();
                            addDisplayObjectDatesYear.Year = contextreturned.change_time.Year;
                            addDisplayObjectDatesYear.Month = contextreturned.change_time.Month;
                            addDisplayObjectDatesYear.day = contextreturned.change_time.Day;
                            addDisplayObjectDatesYear.fulldatetime = contextreturned.change_time;
                            addDisplayObjectDatesYear.CountedDate = 1;
                            SortedDatesDays.Add(addDisplayObjectDatesYear);
                        }
                    }
                }

This gives me an error Collection was modified; enumeration operation may not execute.

so I change the

 foreach (var VARIABLE in SortedDatesDays)

to

foreach (var VARIABLE in SortedDatesDays.ToList())

and now i get out of memory exeption

At the end of the day I need to count how many times an event happened on a certain date I need to put this into a form that i can then use in a chart (DEVEXPRESS) I am not sure if i should use linq or the current system. All out of ideas any help with the corrent way in doing this would be greatly appreciated thanks a0011010011

Upvotes: 1

Views: 117

Answers (2)

Moumit
Moumit

Reputation: 9510

While you are assigning FullDateTime DisplayObjectDates object ... I prefer to say you to reconstruct your class it may be something like this ... it also help your program to use less memery ..

public class DisplayObjectDates
    {
        public int Month { get { return fulldatetime.Month; } }
        public int Year { get { return fulldatetime.Year; } }
        public int day { get { return fulldatetime.Day; } }
        public DateTime fulldatetime { get; set; }
        public int CountedDate { get; set; }
    }

Then sort your initializing function

if (SortedDatesDays.Count() == 0)
        {
            var addDisplayObjectDatesYear = new DisplayObjectDates();                 
            addDisplayObjectDatesYear.fulldatetime = contextreturned.change_time;
            addDisplayObjectDatesYear.CountedDate = 1;
            SortedDatesDays.Add(addDisplayObjectDatesYear);
        }
        else
        {
            foreach (var VARIABLE in SortedDatesDays)
            {
                if (VARIABLE.fulldatetime.Date == contextreturned.change_time.fulldatetime.Date)
                {
                    VARIABLE.CountedDate = VARIABLE.CountedDate++;
                }
                else
                {
                    var addDisplayObjectDatesYear = new DisplayObjectDates();
                    addDisplayObjectDatesYear.fulldatetime = contextreturned.change_time;
                    addDisplayObjectDatesYear.CountedDate = 1;
                    SortedDatesDays.Add(addDisplayObjectDatesYear);
                }
            }
        } 

Upvotes: 0

Ondrej Janacek
Ondrej Janacek

Reputation: 12616

I actually thought that foreach (var VARIABLE in SortedDatesDays.ToArray()) will solve the problem as I use it often.

In that case, try the following.

...
else
{
    // create a temporary collection for storing new items
    var list = new List<DisplayObjectDates>();

    foreach (var VARIABLE in SortedDatesDays)
    {
         if (...) { ... }
         else
         {
              var addDisplayObjectDatesYear = new DisplayObjectDates();
              ...
              // place it to the new list instead
              list.Add(addDisplayObjectDatesYear);
         }
     }

     // merge lists
     SortedDatesDays.AddRange(list);
}

Upvotes: 1

Related Questions