我有一个结构:
struct Student
{
string Name;
int ClassesMissedToday;
}
我现在有一个结构列表:
List<Student> Students = new List<Student>();
如何在LINQ中说出以下内容:
Students.Add(new Student { Name = "Bob", ClassesMissedToday = 2 })
Students.Add(new Student { Name = "Bob", ClassesMissedToday = 0 })
Students.Add(new Student { Name = "Joe", ClassesMissedToday = 0 })
Students.Add(new Student { Name = "Bob", ClassesMissedToday = 1 })
(伪代码)
foreach Student.Name in Students:
Console.WriteLine("Total Classes Missed Total: {0}", ClassedMissedToday(count all of them)
我知道这对某些人来说相当微不足道,但由于某些原因,我似乎无法找到任何有效的简化示例。
想法?
答案 0 :(得分:9)
Sum()
寻求帮助:
int total = students.Sum(s => s.ClassesMissedToday);
此外,您可能会发现自C#3.0以来更有用的集合初始化语法
var students = new List<Student>
{
new Student { Name = "Bob", ClassesMissedToday = 2 },
new Student { Name = "Bob", ClassesMissedToday = 0 },
new Student { Name = "Joe", ClassesMissedToday = 0 },
new Student { Name = "Bob", ClassesMissedToday = 1 }
};
这将执行相同的操作,因为将为正在初始化的集合的每个基础条目调用Add()
方法。
答案 1 :(得分:4)
要获取所有学生错过的课程总数,您可以使用Sum
操作员。
var totalMissed = students.Sum(s => s.ClassesMissedToday);
Console.WriteLine(String.Format("Total classes missed for all students is {0}", totalMissed);
要按学生姓名分组,要获取错过的课程数,您可以使用GroupBy
和Sum
操作以及匿名类型。
var totals = students.GroupBy(s => s.Name).Select(g => new { Name = g.Key, TotalMissed = g.Sum(s => s.ClassesMissedToday) });
foreach (var u in totals)
{
Console.WriteLine(String.Format("Total classes missed today for {0} is {1}", u.Name, u.TotalMissed));
}
答案 2 :(得分:2)
您的问题假定这是使用ForEach
运算符的合适位置。你的问题中有一个foreach循环
foreach Student.Name in Students:
Console.WriteLine("Total Classes Missed Total: {0}",
ClassedMissedToday(count all of them)
但是你真的想为每个学生写一行到Console吗?看来你只是想要
Console.WriteLine("Total Classes Missed Total: {0}",
ClassedMissedToday(count all of them)
你问'我怎样才能把错过的课程总结出来?'。
您可以使用许多LINQ运算符(包括ForEach
运算符(如Will Marcouiller的答案))执行此操作 - 但您希望使用正确的工具执行此操作。这里正确的工具是Sum
运算符。
Console.WriteLine("Total Classes Missed Total: {0}",
ClassedMissedToday(Students.Sum(s => s.ClassesMissedToday))
答案 3 :(得分:1)
int missed;
Students.ForEach(s => missed += s.ClassedMissedToday);
Console.WriteLine("Total : {0}", missed);
答案 4 :(得分:1)
你的问题似乎很奇怪。你确定你想要总结所有学生的总错过天数吗?看看你的伪代码,似乎你的意思是写出那个学生错过的日子。如果是的话......
如果您对学生姓名进行分组,则您只能浏览一次姓名。
这是我的头脑所以它可能包含一个拼写错误。它也不漂亮......
Students.GroupBy(student => student.Name)
.Select(filtered => new object { Name = filtered.Name, Missed = filtered.Sum(groups => groups.ClassesMissedToday) })
.ToList()
.ForEach(s => Console.WriteLine(string.Format("{0} has missed {1} classes", s.Name, s.Missed)));
这是你想要完成的吗?