LINQ ForEach声明

时间:2012-03-22 22:28:15

标签: c# .net linq

我有一个结构:

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)

我知道这对某些人来说相当微不足道,但由于某些原因,我似乎无法找到任何有效的简化示例。

想法?

5 个答案:

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

要按学生姓名分组,要获取错过的课程数,您可以使用GroupBySum操作以及匿名类型。

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

这是你想要完成的吗?

相关问题