【发布时间】:2012-02-18 14:40:03
【问题描述】:
我有两个具有类对象的通用列表:
class Subject
{
public string Code { get; set; }
public string Name { get; set; }
}
还有一个类如下:
class Student
{
public string RollNo { get; set; }
public string Name { get; set;
}
还有一个类型列表,其中卷号和主题代码为学生的 KeyValuePair,如下所示:
List<KeyValuePair<string,string>> RoleList=
new List<KeyValuePair<string,string>> ();
Student st1=new Student();
Subject sb1=new Subject();
Subject sb2=new Subject();
Subject sb3=new Subject();
RoleList.Add(new KeyValuePair<string,string>(st1.RollNo,sb1.Code));
RoleList.Add(new KeyValuePair<string,string>(st1.RollNo,sb2.Code));
RoleList.Add(new KeyValuePair<string,string>(st1.RollNo,sb3.Code));
我需要的是另一个类型的字典
Dictionary<string, List<Subject>> StSbList =
new Dictionary<string, List<Subject>>();
其中 StSbList 应该有一个给定学生的科目列表,使用字典 RoleList 具有给定卷号的所有科目,在 C# 4.0 中使用 LINQ,类似于
StSbList(st1.RollNo, {sb1,sb2,sb3});
我尝试并能够合并到类似的集合,但对不同类型的集合感到震惊。有关任何其他更好方法的任何建议。
正如 Douglas 和 Martin 正确指出的那样,这两种解决方案都运行良好,但在我的测试数据上 ToLookup 运行速度更快,因此使用相同。
解决方案 1
Dictionary<string, List<Subject>> stSbList =
RoleList.GroupBy(kvp => kvp.Key)
.ToDictionary(
grouping => grouping.Key,
grouping => grouping.Select(kvp => (from sub in listSub
where sub.Code.Equals(kvp.Value)
select sub).First()).ToList(),
EqualityComparer<string>.Default);
解决方案 2
var tSbList = RoleList.ToLookup(kvp => kvp.Key, kvp =>
(from sub in listSub
where sub.Code.Equals(kvp.Value)
select sub).First());
【问题讨论】:
-
更清楚地解释您的需求,并向我们展示您的尝试。
-
我已尽力解释我需要什么,但如果可能的话,您可以指出我需要更具体的地方,我很乐意编辑我的问题以及我尝试过的内容我合并到列表和两个字典仅使用此处的一些以前的问题。:)
-
您希望
StSbList持有什么。更清楚地描述这一点。另外,我们不是来做你的工作的,所以请展示你到目前为止所做的尝试。 -
顺便说一句,有几个
RoleList.Add(st1.RollNo, ...);,但这是一个字典,那里ArgumentException会被抛出(“一个具有相同键的项目已经被添加。”)。 -
嗨史蒂文,我没有要求任何人做我的工作,没有冒犯的意思,但我没有发布任何我已经尝试使用 Stack-overflow 中的其他问题的代码,只是保持问题清晰。如果你愿意,我可以再次发布相同的代码。