2017-06-13 50 views
0

我開始用C#.NET編程。我爲工作人員製作了一個網絡日曆,他們可以查看他們因疾病,節假日等原因未上班多少天。 起初,我是用2個數組做的。一個與這些尺寸的完整的日曆:帶有列表(T)屬性的類中具有列表(T)屬性的類

calendar[person_code][month][day][6 items] -> calendar[int][int][int][object (starting absence date, type of absence, etc)]

另一種是用一個工人定義的數組一樣

person[person_code][13 items] -> person[int][13 string (name, surname, etc)]

我想做到這一點帶班來提高我的碼。我想上面的類:

public class absence 
{ 
    public int absenceCode { get; set; } 
    public int typeAbsence { get; set; } 
    public DateTime startingDate { get; set; } 
    public DateTime endingDate { get; set; } 
    public string description { get; set; } 
    public string state { get; set; } 

    public constructors... 
} 

public class calendar 
{ 
    public int day { get; set; } 
    public int month { get; set; } 
    public absence absen { get; set; } 

    public contructors.... 
} 

public class person 
{ 
    public int personCode { get; set; } 
    public string surname { get; set; } 
    public string name { get; set; } 
    public string address { get; set; } 
    public int maxHolidayDays { get; set; } 
    public calendar calend { get; set; } 

    public constructors.... 
} 

這是我的代碼,但我不知道如何處理設置,並像使用數組檢索信息。 我可以爲每個人創建一個新的實例,但我需要在獨特的一天創建一些缺席。 (一個工人可以缺勤一天有時) 我雖然有關使用列表(T)類像

List<person> = new List<person>(), and List<absence> = new List<absence>()

,但我怎麼可能設置嵌套在「日曆的一天List<absence>() 「班? 我需要設置一個日曆日至極內部的名單初級講座的人從名單:/

List<person> -> calendar -> List<absence> 

我希望這是很清楚你。 此致敬禮。

+1

備註:您需要開始遵循以下命名約定:https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/capitalization-conventions – user3185569

+1

您能否更清楚?就像製作想要製作的所需數據結構的層次結構一樣?據我瞭解,你可以在'person'中製作一個'calendar'的列表,以保持你的工作人員每次缺席。 –

+0

對我來說,你不需要'日曆類就可以得到所有人的缺席。 –

回答

0

我會這樣做。 1.Skip日曆類 2.In人缺席的添加類集合(如表) 3,如果您有IEnumerable的(如列表,人[])你可以搜索數據,需要

public class absence 
{ 
    public int absenceCode { get; set; } 
    public int typeAbsence { get; set; } 
    public DateTime startingDate { get; set; } 
    public DateTime endingDate { get; set; } 
    public string description { get; set; } 
    public string state { get; set; } 
} 

public class person 
{ 
    public int personCode { get; set; } 
    public string surname { get; set; } 
    public string name { get; set; } 
    public string address { get; set; } 
    public int maxHolidayDays { get; set; } 
    // Initialize in constructor if you have an error 
    public List<absence> absences { get; set; } = new List<absence>(); 
} 

由於搜索它會很容易。比方說,你需要的人在特定的日期缺席:

IEnumerable<person> Persons = GetPersonsList(); 
DateTime dateToCheck = GetAbsentDate(); 

var absentPersons = Persons.Where(x=>x.absences.Any(a=>a.startingDate>= dateToCheck&&a.endingDate<= dateToCheck)); 
+0

哦!非常好!!這樣更清楚。我沒有考慮使用Linq – Grefu

+0

想一想。人與缺席之間有什麼樣的關係?一個人,我有幾個缺席...所以,缺席應該是人的一部分或其他? –

+0

它應該是1:n的關係。可能是因爲同一原因,2名工人在同一天缺勤。會有兩個相同的缺席,但每個人都屬於別人。有一個「人代碼」屬性,但我認爲與班級合作是沒有必要的,不是嗎? – Grefu

0

首先,在對問題的評論中提及user3185569,你必須使用這個指令更改代碼:Capitalization Conventions

其次,你必須考慮數據表示。人與缺席之間的關係是什麼樣的?一個人可能有幾次缺席(1:N關係)。所以,你必須存儲關於缺勤的數據和與此缺席有關的人。

類:

public class Person 
{ 
    public int PersonCode { get; set; } 
    public string Surname { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 

    //constructor, etc. 

    public override string ToString() 
    { 
     return string.Format("{0} {1} {2} {3}", PersonCode, Surname, Name, Address); 
    } 

} 

public class Absence 
{ 
    public int AbsenceCode { get; set; } 
    public int TypeAbsence { get; set; } 
    public DateTime StartingDate { get; set; } 
    public DateTime EndingDate { get; set; } 
    public string Description { get; set; } 
    public string State { get; set; } 
    //"a link" to person 
    public Person Person { get; set; } 

    //constructor, etc. 

    public override string ToString() 
    { 
     return string.Format("{0}\t|\t{1}\t{2}\t{3}", Person.ToString(), TypeAbsence.ToString(), 
      StartingDate.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture), 
      EndingDate.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture)); 

    } 
} 

用法:

List<Person> persons = new List<Person>() 
    { 
     new Person() {PersonCode = 1, Surname = "Los", Name = "Maciej", Address = "Poland, ..."}, 
     new Person() {PersonCode = 2, Surname = "Doe", Name = "John", Address = "USA, ..."}, 
     new Person() {PersonCode = 3, Surname = "McAlister", Name = "Fred", Address = "UK, ..."}, 
     new Person() {PersonCode = 4, Surname = "Sommer", Name = "Anna", Address = "Canada, ..."}, 
    }; 

List<Absence> absences = new List<Absence>() 
    { 
     new Absence(){AbsenceCode = 1, TypeAbsence=1, StartingDate = new DateTime(2017,5,11), EndingDate = new DateTime(2017,5,15), 
      Description = "whatever", State = "A", Person = persons[0]}, 
     new Absence(){AbsenceCode = 2, TypeAbsence=1, StartingDate = new DateTime(2017,5,18), EndingDate = new DateTime(2017,6,8), 
      Description = "whatever", State = "A", Person = persons[1]}, 
     new Absence(){AbsenceCode = 3, TypeAbsence=2, StartingDate = new DateTime(2017,6,1), EndingDate = new DateTime(2017,6,12), 
      Description = "whatever", State = "B", Person = persons[2]}, 
     new Absence(){AbsenceCode = 4, TypeAbsence=2, StartingDate = new DateTime(2017,6,1), EndingDate = new DateTime(2017,6,5), 
      Description = "whatever", State = "B", Person = persons[0]}, 
     new Absence(){AbsenceCode = 5, TypeAbsence=1, StartingDate = new DateTime(2017,6,2), EndingDate = new DateTime(2017,6,5), 
      Description = "whatever", State = "A", Person = persons[2]} 
    }; 

//define date-range to filter Absences data 
DateTime dfrom = new DateTime(2017,6,5); 
DateTime dTo = new DateTime(2017,6,9); 

var LastWeekAbsencesByPerson = absences 
    .Where(x=> (x.StartingDate<=dTo) && (x.EndingDate>=dfrom)) 
    .OrderBy(x => x.Person.Surname) 
    .ThenBy(x => x.StartingDate) 
    .ToList(); 

foreach(var lwabp in LastWeekAbsencesByPerson) 
{ 
    Console.WriteLine("{0}", lwabp.ToString()); 
    Console.WriteLine("{0}", new string('-', 60)); 
} 

在以相同的方式,可以按日期,人,缺席的類型等

過濾數據作爲對日期過濾器,我強烈建議閱讀此:Determine Whether Two Date Ranges Overlap

有很多t要做,改善,但這是你的工作。

祝你好運!