【问题标题】:A Class with List(T) property inside a Class with a List(T) property具有 List(T) 属性的类中的具有 List(T) 属性的类
【发布时间】:2017-06-13 07:56:15
【问题描述】:

我开始使用 C# .NET 进行编程。我为工人制作了一个网络日历,他们可以在其中查看由于疾病、假期等原因没有上班的天数。 起初我是用 2 个数组来做的。一个用于具有这些尺寸的完整日历:

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....
}

这是我的代码,但我不知道如何处理设置和检索信息,例如使用数组。 我可以为每个人创建一个新的实例,但我需要在一个独特的日子创建一些缺勤。 (一名工人一天可以缺勤几次) 我曾想过要使用类似的 List(T) 类

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

但是我如何设置一个嵌套在一天的“日历”类中的List<absence>()? 我需要在一个日历日内设置该列表,该列表低于列表中的一个人:/

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

我希望这对你来说已经足够清楚了。 问候。

【问题讨论】:

  • 旁注:您需要开始遵循命名约定:docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
  • 你能说清楚点吗?就像制作您想要制作的所需数据结构的层次结构?据我了解,您可以在person 中列出calendar,以保留您的员工的每一次缺勤。
  • 对我来说,你不需要calendar 类就能得到所有缺勤的人。
  • 正如我所说,我正在学习 C#,所以我使用了数组,因为对我来说最简单。层次结构应该是:一个人有一个相关的日历,每天有或没有一些缺勤。 P.ej。 John Doe 有一个日历,其中 3 日缺席。 1 月和 6 月 6 日两次缺席。我可以定义一个具有 List 缺席属性的 person 类,它会包含所有这些缺席,但我认为这根本不正确。我认为很清楚有一个人课,一个日历课和一个缺勤课。你怎么看?

标签: c# list class


【解决方案1】:

我会这样做。 1.跳过日历课 2.在人班添加缺勤集合(例如列表) 3.如果你有IEnumerable(例如List, person[])你可以搜索你需要的数据

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));

【讨论】:

  • 哦!非常好!!这样一来就更清楚了。我没有考虑过使用 Linq
  • 想想吧。人与缺席之间正在形成什么样的关系?一个人我有好几次缺席......所以,缺席应该是人的一部分还是其他?
  • 应该是1:n的关系。可能是同一天有 2 名工人出于同样的原因缺勤。将有 2 个相同的缺席,但每个缺席都属于其他人。它有一个“个人代码”属性,但我认为使用类没有必要,不是吗?
  • @Grefu,请在回复开头使用 [@Login] 约定,以确保将通知 OP。
【解决方案2】:

首先,正如问题评论中提到的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

有很多事情要做,要改进,但这是你的工作。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多