通过一个方法得到一个学生名单A,有学号姓名等通过另外一个方法,得到一部分学生的学号和成绩B。现在要得到一个通过第一个方法得到的学生名单和他们的成绩,如果没有成绩的就为空或者0====我的做法是 从学生派生一个有成绩的学生实体,加一个成绩字段
并new出一个集合C。遍历学生名单A,反射属性,给新派生的学生实体赋值,并查询B集合,给成绩赋值====
看着满简单的需求,写的太复杂,有没有更简单的方法呢?
并new出一个集合C。遍历学生名单A,反射属性,给新派生的学生实体赋值,并查询B集合,给成绩赋值====
看着满简单的需求,写的太复杂,有没有更简单的方法呢?
var query = from a in list1 join b in list2 on a.Id equals b.Id
select new Student { a.Id, a.Name, b.Score1 };这点代码量还是要比反射强多了吧。
{
public string StuNo { get; set; }
public string Name { get; set; }
} public class Score
{
public string StuNo { get; set; }
public List<int> Scores { get; set; }
} List<Student> listStu = new List<Student>
{
new Student{ StuNo="001", Name="A"},
new Student{ StuNo="002", Name="B"},
new Student{ StuNo="003", Name="C"},
new Student{ StuNo="004", Name="D"},
}; List<Score> listScore = new List<Score>
{
new Score{StuNo="001", Scores=new List<int>{94,92,95,90}},
new Score{StuNo="002", Scores=new List<int>{66,77,88,99}},
new Score{StuNo="004", Scores=new List<int>{78,87,65,77}}
}; var query = from stu in listStu
join score in listScore on stu.StuNo equals score.StuNo into group1
from result in group1.DefaultIfEmpty()
select new { stu.StuNo, stu.Name, Scores = result == null ? new List<int>() : result.Scores };
foreach (var stu in query)
Console.WriteLine("{0} {1} {2}", stu.StuNo, stu.Name, string.Join(",", stu.Scores.ToArray()));
要把集合里的元素变成类的属性吗,行转列,在Linq To SQL里可能复杂,但在Linq To Object里应该不会太复杂吧。如果返回的结果仅仅用于做数据绑定,可以用ICustomTypeDescriptor来实现。
不过话说回来,楼主的表述上说要对学生名单A,反射属性,而你给的Linq是在知道学生名单A类型的情况下,无需反射的情况下使用的。我一直不明白为啥这个给定学生名单A不能是具体的类型。
//去成绩列表里找这个学生,若找到则给分
var findS = List<Score> .Where(s=> s.No == st.No).SingleOrDefault();
st.score = findS == null ? 0 : findS.score;
return st as Score;
});
这就是你设计的取舍了。反射的确能减少这样的变更风险。(这种反射的性能也不会有很大的损失)
写个通用的属性拷贝方法。反射出GetMethod()和SetMethod(),用Delegate.CreateDelegate方式创建
属性取值和赋值的delegate,性价比还是比较高的。
转化思考下下吗!
var newObjs =
from 学生 in A
join 成绩 in B on A.学好 equals B.序号 into AB
from 综合 in AB.DefaultIfEmpty()
select 综合;