[英]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.在这几天填写主题(
Name
和Time
)。
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.