简体   繁体   English

C#-使用LINQ从另一个列表填充列表

[英]C# - Filling List with LINQ from another List<>

Here's my main class: 这是我的主要课程:

public class Subject
{
    public struct Class
    {
        public byte Day { get; set; }
        public DateTime Time { get; set; }
    }

    public string Name { get; set; }

    public List<Class> Data { get; set; }
}

For example, 例如,

List<Subject> subjects = new List<Subject>
        {
            new Subject()
            {
                Name = "Math",
                Data = new List<Class>()
                {
                    new Class { Day = 2, Time = Convert.ToDateTime("8:30") },
                    new Class { Day = 2, Time = Convert.ToDateTime("10:25") }
                }
            },
            new Subject()
            {
                Name = "Astronomy",
                Data = new List<Class>()
                {
                    new Class { Day = 2, Time = Convert.ToDateTime("12:30") },
                    new Class { Day = 4, Time = Convert.ToDateTime("14:30") }
                }
            },
            new Subject()
            {
                Name = "Chemistry",
                Data = new List<Class>()
                {
                    new Class { Day = 3, Time = Convert.ToDateTime("8:30") }
                }
            },
            new Subject()
            {
                Name = "Physics",
                Data = new List<Class>()
                {
                    new Class { Day = 3, Time = Convert.ToDateTime("10:25") },
                    new Class { Day = 4, Time = Convert.ToDateTime("12:30") }
                }
            }
        };

The data above is filling up by parsing JSON. 上面的数据通过解析JSON进行填充。 But now I need to do next: 但是现在我需要做下一步:

1.Select all distinct Day (in this case: 2, 3, 4); 1.选择所有不同的Day (在这种情况下:2、3、4); 2. Fill this days with subject ( Name and Time ). 2.在这几天填写主题( NameTime )。

I created this: 我创建了这个:

public class Schedule
{
    public struct Subject
    {
        public string Name { get; set; }
        public DateTime Time { get; set; }
    }

    public struct Day
    {
        public byte DayOfWeek { get; set; }
        public List<Subject> Subjects { get; set; }
    }

    public List<Day> Days { get; set; }
}

so I except to do something like this: 所以我除了要做这样的事情:

Schedule schedule = new Schedule();
schedule.Days = new List<Schedule.Day>()
{
    new Schedule.Day()
    {
        DayOfWeek = 2,
        Subjects = new List<Schedule.Subject>()
        {
            new Schedule.Subject() { Name = "Math", Time = Convert.ToDateTime("8:30") },
            new Schedule.Subject() { Name = "Math", Time = Convert.ToDateTime("10:25") },
            new Schedule.Subject() { Name = "Astronomy", Time = Convert.ToDateTime("12:30") }
        }
    },
    new Schedule.Day()
    {
        DayOfWeek = 3,
        Subjects = new List<Schedule.Subject>()
        {
            new Schedule.Subject() { Name = "Chemistry", Time = Convert.ToDateTime("8:30") },
            new Schedule.Subject() { Name = "Physics", Time = Convert.ToDateTime("10:25") },
        }
    },
    new Schedule.Day()
    {
        DayOfWeek = 4,
        Subjects = new List<Schedule.Subject>()
        {
            new Schedule.Subject() { Name = "Physics", Time = Convert.ToDateTime("12:30") },
            new Schedule.Subject() { Name = "Astronomy", Time = Convert.ToDateTime("14:30") }
        }
    }
};

The question is How I can select data to Schedule from List<Subjects> with LINQ (I don't wanna use loops). 问题是如何使用LINQ从List<Subjects>选择要Schedule数据 (我不想使用循环)。

        var result = subjects
            .SelectMany(s => s.Data.Select(x => new { s.Name, x.Day, x.Time }))
            .GroupBy(x => x.Day)
            .Select(g => new Schedule.Day
                {
                    DayOfWeek = g.Key,
                    Subjects = g.Select(item => new Schedule.Subject
                        {
                            Name = item.Name,
                            Time = item.Time
                        })
                        .OrderBy(item => item.Time)
                        .ToList()
                })
                .OrderBy(gItem => gItem.DayOfWeek)
            .ToList();

And then.... 接着....

Schedule schedule = new Schedule();
schedule.Days = result;

It's also weird to put the List<Day> inside the schedule class. List<Day>放在时间表类中也很奇怪。

Out of fun I've rewritten the solution to promote the Query-Expression Syntax. 出于乐趣,我重写了解决方案以提升查询表达语法。

IEnumerable<Schedule.Day> scheduledDays =
  from subj in subjList
  from cl in subj.Data
  select new { Class = cl, SubjectName = subj.Name } into classWithSubject
  group classWithSubject by classWithSubject.Class.Day into classesByDay
  orderby classesByDay.Key
  select new Schedule.Day()
  {
    DayOfWeek = classesByDay.Key,
    Subjects = (from cl in classesByDay
                orderby cl.Class.Time
                select new Schedule.Subject() { Name = cl.SubjectName, Time = cl.Class.Time }).ToList()
  };
Schedule sched = new Schedule() { Days = scheduledDays.ToList() };

If I right understood, You can use ForEach LINQ: 如果我理解正确,则可以使用ForEach LINQ:

schedule.Days.ForEach(x => x.Subjects.ForEach(y => Console.WriteLine($"{y.Name}, {y.Time}")));

Instead of 代替

 Console.WriteLine($"{y.Name}, {y.Time}")

You can write this info into some variables. 您可以将此信息写入一些变量。

PS ForEach will pass all elements of list. PS ForEach将传递列表的所有元素。

Try this: 尝试这个:

var newQuery = subjects.SelectMany(y => y.Data.Select(x=> new {x.Day,x.Time,y.Name }));
var newQuery2 = newQuery.OrderBy(x=>x.Day).OrderBy(x=>x.Time).GroupBy(x => x.Day);
var newQuery3 = newQuery2.Select(x => new Schedule.Day
            {
                DayOfWeek = x.Key,
                Subjects = x.Select(y => new Schedule.Subject
                {
                    Time = y.Time,
                    Name = y.Name
                }).ToList()
            });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM