LINQ ForEach语句

4

我有一个结构体:

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个回答

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()方法。

您可以考虑使用更通用的Aggregate方法,当Sum不足时。 - Alexei Levenkov
@Alaxei:不确定我是否理解你的想法,我知道Aggregate()但不确定它在这种情况下如何更有用? - sll
“Sum”与students.Aggregate(0, (t,s ) => t + s.ClassesMissedToday)相同,但如果需要更多的灵活性,则可以使用Sum(在这种特定情况下,Sum更好)。 - Alexei Levenkov

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
你的问题假设在这里使用一个 ForEach 操作符是适当的。你在问题中已经有了一个 foreach 循环。
foreach Student.Name in Students:
   Console.WriteLine("Total Classes Missed Total: {0}", 
       ClassedMissedToday(count all of them)

但是你真的想要为每个学生编写一行控制台代码吗?看起来你只需要

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

+1 使用Sum很好!我必须说,我很少这样总结事情,我想知道我是否会想到它。无论如何,谢谢!=) - Will Marcouiller

1
int missed;
Students.ForEach(s => missed += s.ClassedMissedToday);
Console.WriteLine("Total : {0}", missed);

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

这是你想要完成的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接