如何提升这个复杂的集合对象查询的效率?
有一个学生信息集合(studentList),里面包含1000条以上的学生信息(学生学号 sId, 学生姓名 sName , 学生年龄 sAge.......),然后有一个学生组的集合(groupList),每个组是包含 一个或多个学生,一个学生可以属于多个组,组有组号 (gId),组类别(gType), 组名(gName), 学号集合(sIdList),现需要按组名顺序打印出组类别是("A")并且组成员大于5的所有组以及该组的所有学生信息(同一组内的学生信息按学号排列)。我想了一下有下面两种做法,一种Linq,一种用以前普通的集合查询(比较笨的方法)。现列在下面。
1.Linq
//Student class
public class Student
{
public string sId;
public string sname;
public int sAge;
}
//Group class
public class Group
{
public string gId;
public string gType;
public string gName;
public List<int> sIdList;
}
class Program
{
static void Main(string[] args)
{
List<Group> groupList = new List<Group>();
List<Student> student = new List<Student>();
//Add data to groupList, student
var aGroupQry = from item in groupList
where item.gType.Equals("A")
orderby item.gName ascending
select aGroupQry;
string groupName;
foreach(Group grp in aGroupQry)
{
groupName = grp.gName;
var stdQry = from stuItem in student
orderby stuItem.sId ascending
join grpItem in grp.sIdList on stuItem.sId equals grpItem
select stuItem;
if (stdQry.Count() > 5)
{
//print grounName;
foreach (Student stu in stdQry)
{
//print stu info under current group
}
}
}
}
}
--------------------编程问答-------------------- class Program
{
static void Main(string[] args)
{
List <Group> groupList = new List <Group>();
List <Student> student = new List <Student>();
//Add data to groupList, student
List<string> sIdList;
List<Student> stuList;
Dictionary<Group, List<Student>> dic = new Dictionary<Group,List<Student>>();
foreach (Group grp in groupList)
{
if(!grp.gType.Equals("A"))
return;
sIdList = grp.sIdList;
stuList = new List<Student>();
dic.Add(grp, stuList);
foreach (Student stu in student)
{
if (sIdList.Contains(stu.sId))
{
stuList.Add(stu);
}
}
}//End of foreach (Group grp in groupList)
//对dic进行排序和过滤,去掉组中成员数量小于5的组,对它按组的名称,组内按学号顺序来排列
//打印出来结果 --------------------编程问答-------------------- 现在问题是这两种方法查询出来的效率都很低,不知道大家有没有碰到过类似的问题 ,有没有更好的改进办法,先谢了。 --------------------编程问答-------------------- 问题的根源在于Group.sIdList是一个是一组数!
class Program
{
static void Main(string[] args)
{
List <Group> groupList = new List <Group>();
List <Student> student = new List <Student>();
var astudent = from s in student
from g in groupList
orderby s.sId ascending
where g.gType.Equals("A") && g.忘记了有个包含的方法(s.sId)&&一系列
当然查询结果有重复需要过滤就ok,至于5个一组你就可以遍历一遍咯
}
}
补充:.NET技术 , LINQ