求一段linq
本帖最后由 bettercong 于 2013-06-08 11:08:36 编辑 我有一个list集合
id 班级 姓名 科目 分数
1 一班 张三 语文 100
2 一班 张三 数学 100
3 一班 张三 外语 100
4 二班 李四 语文 95
5 二班 李四 数学 95
6 二班 李四 外语 95
7 二班 王五 语文 90
8 二班 王五 数学 90
9 二班 王五 外语 90
......
linq查询分组的结果如下:
id 班级 姓名 排名 总分
1 一班 张三 1 300
2 二班 李四 2 285
3 二班 王五 3 270
大致的意思就是大前提是班级,然后再是每个班级下把每个学生的总分排名
最后list集合就剩下这三条数据,或者算完之后再放到一个新的list集合里也可以
请问linq怎么做?
[解决办法]
List<Student> list = new List<Student>
{
new Student{Classname="一班",Name="张三",Lesson="a",Score=100},
new Student{Classname="一班",Name="张三",Lesson="b",Score=100},
new Student{Classname="一班",Name="张三",Lesson="c",Score=100},
new Student{Classname="二班",Name="李四",Lesson="a",Score=95},
new Student{Classname="二班",Name="李四",Lesson="b",Score=95},
new Student{Classname="二班",Name="李四",Lesson="c",Score=95},
new Student{Classname="三班",Name="王五",Lesson="a",Score=90},
new Student{Classname="三班",Name="王五",Lesson="b",Score=90},
new Student{Classname="三班",Name="王五",Lesson="c",Score=90}
};
var query = list.GroupBy(x => x.Classname).Select(x=>new {ClassName=x.Key,Name=x.FirstOrDefault().Name,Total=x.Sum(p=>p.Score)});
foreach (var item in query)
{
Console.WriteLine("班级:{0} 名字:{1} 总分:{2}",item.ClassName,item.Name,item.Total);
}
[解决办法]
int i = 1;
var query = (from l in list
group l by new { l.stuclass, l.name } into g
select new Student
{
id = i++,
stuclass = g.Key.stuclass,
name = g.Key.name,
score = g.Sum(x => x.score)
}).OrderByDescending(y => y.score);
foreach (Student m in query)
{
Console.WriteLine(m.id + "\t" + m.stuclass + "\t" + m.name + "\t" + m.score);
}
[解决办法]
public class Student
{
public int id { get; set; }
public string stuclass { get; set; }
public string name { get; set; }
public string subject { get; set; }
public float score { get; set; }
}
static void Main(string[] args)
{
/*
id 班级 姓名 科目 分数
1 一班 张三 语文 100
2 一班 张三 数学 100
3 一班 张三 外语 100
4 二班 李四 语文 95
5 二班 李四 数学 95
6 二班 李四 外语 95
7 二班 王五 语文 90
8 二班 王五 数学 90
9 二班 王五 外语 90
*/
List<Student> list = new List<Student>() {
new Student { id = 1, stuclass = "一班", name = "张三", subject = "语文", score = 100 },
new Student { id = 2, stuclass = "一班", name = "张三", subject = "数学", score = 100 } ,
new Student { id = 3, stuclass = "一班", name = "张三", subject = "外语", score = 100 } ,
new Student { id = 4, stuclass = "二班", name = "李四", subject = "语文", score = 95 }
,
new Student { id = 5, stuclass = "二班", name = "李四", subject = "数学", score = 95 }
,
new Student { id = 6, stuclass = "二班", name = "李四", subject = "外语", score = 95 }
,
new Student { id = 7, stuclass = "二班", name = "王五", subject = "语文", score = 90 }
,
new Student { id = 8, stuclass = "二班", name = "王五", subject = "数学", score = 90 }
,
new Student { id = 9, stuclass = "二班", name = "王五", subject = "外语", score = 90 }
};
int i = 1;
var query = (from l in list
group l by new { l.stuclass, l.name } into g
select new Student
{
id = i++,
stuclass = g.Key.stuclass,
name = g.Key.name,
score = g.Sum(x => x.score)
}).OrderByDescending(y => y.score);
foreach (Student m in query)
{
Console.WriteLine(m.id + "\t" + m.stuclass + "\t" + m.name + "\t" + m.score);
}
}
[解决办法]
public struct 成绩
{
public int id;
public string 班级;
public string 姓名;
public string 科目;
public int 分数;
}
private void button1_Click(object sender, EventArgs e)
{
List<成绩> 成绩s = new List<成绩>();
//张三
成绩s.Add(new 成绩() { id = 1, 班级 = "一班", 姓名 = "张三", 科目 = "语文", 分数 = 100 });
成绩s.Add(new 成绩() { id = 1, 班级 = "一班", 姓名 = "张三", 科目 = "数学", 分数 = 100 });
成绩s.Add(new 成绩() { id = 1, 班级 = "一班", 姓名 = "张三", 科目 = "外语", 分数 = 100 });
//李四
成绩s.Add(new 成绩() { id = 1, 班级 = "二班", 姓名 = "李四", 科目 = "语文", 分数 = 95 });
成绩s.Add(new 成绩() { id = 1, 班级 = "二班", 姓名 = "李四", 科目 = "数学", 分数 = 95 });
成绩s.Add(new 成绩() { id = 1, 班级 = "二班", 姓名 = "李四", 科目 = "外语", 分数 = 95 });
//王五
成绩s.Add(new 成绩() { id = 1, 班级 = "二班", 姓名 = "王五", 科目 = "语文", 分数 = 90 });
成绩s.Add(new 成绩() { id = 1, 班级 = "二班", 姓名 = "王五", 科目 = "数学", 分数 = 90 });
成绩s.Add(new 成绩() { id = 1, 班级 = "二班", 姓名 = "王五", 科目 = "外语", 分数 = 90 });
var results = from t in 成绩s group t by new { t.班级,t.姓名} into g select new {班级=g.Key.班级, 姓名 = g.Key.姓名,
总分 = g.Sum(x => x.分数) };
foreach (var result in results)
{
richTextBox1.Text += result.班级 + "," + result.姓名 + "," + result.总分 + "\n";
}
}