C# 合并两个列表和一个词典以创建单个词典
我有两个具有类对象的通用列表:C# 合并两个列表和一个词典以创建单个词典,c#,.net,linq,c#-4.0,C#,.net,Linq,C# 4.0,我有两个具有类对象的通用列表: class Subject { public string Code { get; set; } public string Name { get; set; } } 另一类如下: class Student { public string RollNo { get; set; } public string Name { get; set; } List<KeyValuePair<string,string>
class Subject
{
public string Code { get; set; }
public string Name { get; set; }
}
另一类如下:
class Student
{
public string RollNo { get; set; }
public string Name { get; set;
}
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));
以及具有卷号和主题代码作为学生键值对的类型列表,如下所示:
class Student
{
public string RollNo { get; set; }
public string Name { get; set;
}
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));
我尝试过并能够合并到类似的集合中,但遇到了不同类型的集合。任何关于其他更好方法的建议
正如Douglas和Martin正确指出的,两种解决方案都运行良好,但在我的测试数据上,ToLookup工作得更快,所以使用相同的方法
解决方案1
你的问题不是很清楚。如果您想了解一个如何填充词典的示例,这里有一个:
Dictionary<string, List<Subject>> stSbList = new Dictionary<string, List<Subject>>();
stSbList.Add(st1.RollNo, new List<Subject> { sb1, sb2, sb3 });
stSbList.Add(st2.RollNo, new List<Subject> { sb1, sb3 });
stSbList.Add(st3.RollNo, new List<Subject> { sb1, sb2 });
要将其转换为字典,可以先使用GroupBy运算符,然后使用ToDictionary:
更新3:适用于最新版本的代码:
var subjects = new[] { sb1, sb2, sb3 }.ToDictionary(sb => sb.Code);
Dictionary<string, List<Subject>> stSbList =
RoleList.GroupBy(kvp => kvp.Key)
.ToDictionary(
grouping => grouping.Key,
grouping => grouping.Select(kvp => subjects[kvp.Value]).ToList());
你的问题不是很清楚。如果您想了解一个如何填充词典的示例,这里有一个:
Dictionary<string, List<Subject>> stSbList = new Dictionary<string, List<Subject>>();
stSbList.Add(st1.RollNo, new List<Subject> { sb1, sb2, sb3 });
stSbList.Add(st2.RollNo, new List<Subject> { sb1, sb3 });
stSbList.Add(st3.RollNo, new List<Subject> { sb1, sb2 });
要将其转换为字典,可以先使用GroupBy运算符,然后使用ToDictionary:
更新3:适用于最新版本的代码:
var subjects = new[] { sb1, sb2, sb3 }.ToDictionary(sb => sb.Code);
Dictionary<string, List<Subject>> stSbList =
RoleList.GroupBy(kvp => kvp.Key)
.ToDictionary(
grouping => grouping.Key,
grouping => grouping.Select(kvp => subjects[kvp.Value]).ToList());
要获得所需的词典,可以使用extension方法 你想保留主题对象,但在你的问题中,你似乎把它们扔掉了,只把它们的代码存储在字典里。我冒昧地稍微修改了您创建RoleList的方式: StSbList将包含以下数据: Key | Value -------+--------- Roll 1 | subject1 Roll 1 | subject2 Roll 1 | subject3 Roll 2 | subject2 Roll 2 | subject3 Key | Value -------+----------------------------- Roll 1 | subject1, subject2, subject3 Roll 2 | subject2, subject3
要获得所需的词典,可以使用extension方法 你想保留主题对象,但在你的问题中,你似乎把它们扔掉了,只把它们的代码存储在字典里。我冒昧地稍微修改了您创建RoleList的方式: StSbList将包含以下数据: Key | Value -------+--------- Roll 1 | subject1 Roll 1 | subject2 Roll 1 | subject3 Roll 2 | subject2 Roll 2 | subject3 Key | Value -------+----------------------------- Roll 1 | subject1, subject2, subject3 Roll 2 | subject2, subject3
为了获得所需的词典,有必要为主题创建关联存储。 请看一下代码
Student st1 = new Student
{
Name = "John",
RollNo = "Roll 1"
};
Subject sb1 = new Subject
{
Code = "Subject 1"
};
Subject sb2 = new Subject
{
Code = "Subject 2"
};
Subject sb3 = new Subject
{
Code = "Subject 3"
};
// Create the associative dictionary for subjects.
var subjectsByCode = new [] { sb1, sb2, sb3 }.ToDictionary(subject => subject.Code, subject => subject);
// Many-to-many relationship: Student (RollNo) <=> Subject (Code).
List<KeyValuePair<string,string>> roleList = new List<KeyValuePair<string,string>>
{
new KeyValuePair<string, string>(st1.RollNo, sb1.Code),
new KeyValuePair<string, string>(st1.RollNo, sb2.Code),
new KeyValuePair<string, string>(st1.RollNo, sb3.Code)
};
// Create Student RollNo => List of Subjects dictionary.
Dictionary<string, List<Subject>> studentRollNoToSubjects = roleList
.GroupBy(pair => pair.Key) // Group by RollNo
.ToDictionary(group => group.Key, // Key of the dictionary is RollNo.
group => group.Select(pair => subjectsByCode[pair.Value]).ToList()); // List of subjects is created using subjects-by-code dictionary.
为了获得所需的词典,有必要为主题创建关联存储。 请看一下代码
Student st1 = new Student
{
Name = "John",
RollNo = "Roll 1"
};
Subject sb1 = new Subject
{
Code = "Subject 1"
};
Subject sb2 = new Subject
{
Code = "Subject 2"
};
Subject sb3 = new Subject
{
Code = "Subject 3"
};
// Create the associative dictionary for subjects.
var subjectsByCode = new [] { sb1, sb2, sb3 }.ToDictionary(subject => subject.Code, subject => subject);
// Many-to-many relationship: Student (RollNo) <=> Subject (Code).
List<KeyValuePair<string,string>> roleList = new List<KeyValuePair<string,string>>
{
new KeyValuePair<string, string>(st1.RollNo, sb1.Code),
new KeyValuePair<string, string>(st1.RollNo, sb2.Code),
new KeyValuePair<string, string>(st1.RollNo, sb3.Code)
};
// Create Student RollNo => List of Subjects dictionary.
Dictionary<string, List<Subject>> studentRollNoToSubjects = roleList
.GroupBy(pair => pair.Key) // Group by RollNo
.ToDictionary(group => group.Key, // Key of the dictionary is RollNo.
group => group.Select(pair => subjectsByCode[pair.Value]).ToList()); // List of subjects is created using subjects-by-code dictionary.
请更清楚地说明您需要什么,并向我们展示您的尝试。我已尽最大努力解释我需要什么,但如果可能,您可以告诉我需要更具体的地方,我很乐意编辑我的问题,关于我尝试过的内容,我只使用这里前面的一些问题合并到列表和两个词典中:你认为StSbList能容纳什么。请更清楚地描述这一点。另外,我们不是来做你的工作的,所以请展示你迄今为止所做的尝试。顺便说一下,这里有几个RoleList.Addst1.RollNo。。。;,但这是一本字典,将抛出一个与已添加的键相同的项。嗨,史蒂文,我没有要求任何人做我的工作,没有冒犯的意思,但我没有发布任何代码,我已经尝试使用堆栈溢出中的一些其他问题,只是保持问题清楚。如果您愿意,我可以再次发布相同的代码。请更清楚地解释您需要什么,并向我们展示您尝试过的内容。我已尽最大努力解释我需要什么,但如果可能,您可以指出我需要更具体的地方,我很乐意编辑我的问题,关于我尝试过的内容,我只使用这里前面的一些问题合并到列表和两个词典中:你认为StSbList能容纳什么。请更清楚地描述这一点。另外,我们不是来做你的工作的,所以请展示你迄今为止所做的尝试。顺便说一下,这里有几个RoleList.Addst1.RollNo。。。;,但这是一本字典,将抛出一个与已添加的键相同的项。嗨,史蒂文,我没有要求任何人做我的工作,没有冒犯的意思,但我没有发布任何代码,我已经尝试使用堆栈溢出中的一些其他问题,只是保持问题清楚。如果你愿意,我可以再次发布相同的代码。我不是在问如何初始化字典。但问题是使用两个列表和一个字典根据某些条件将它们合并在一起,以获得另一个字典,该字典由初始列表中的一个对象组成。@Douglas-Thanx为了更新,我刚刚编辑了我的问题以消除混淆。@Douglas-var subjects=new[]{sb1,sb2,sb3}.ToDictionarysb=>sb.Code;对于这一部分,我有一个主题列表,我需要直接使用它。@PanditA:如果你希望别人帮助你,你真的应该花更多的精力来正确地阐述你的问题。您至少更改了4次问题的内容,经常给出明显不正确的代码,您是说它仍然不完整?您的示例中的主题列表在哪里?@PanditA,那么您可能应该根据该列表创建词典。查找这样的列表会很慢。我不是问如何初始化字典。但问题是使用两个列表和一个字典根据某些条件将它们合并在一起,以获得另一个字典,该字典由ini中的一个对象组成
tial list.@Douglas-Thanx为了更新,我刚刚编辑了我的问题以消除混淆。@Douglas-var subjects=new[]{sb1,sb2,sb3}.ToDictionarysb=>sb.Code;对于这一部分,我有一个主题列表,我需要直接使用它。@PanditA:如果你希望别人帮助你,你真的应该花更多的精力来正确地阐述你的问题。您至少更改了4次问题的内容,经常给出明显不正确的代码,您是说它仍然不完整?您的示例中的主题列表在哪里?@PanditA,那么您可能应该根据该列表创建词典。在这样的列表中查找会很慢。我认为这又错过了一步:结果应该包含主题,而不是它们的代码。@Martin Liversage:我不仅需要主题代码,还需要主题类的对象。@Martin:我使用了下面的代码,但在任何给定代码的分组中,我得到的元素计数为4,而我只有三个主题。它显示为NULL的最后一个元素。我的代码是:var tSbList=RoleList.ToLookupkvp=>kvp.Key,kvp=>listSub中的from sub,其中sub.code.equalsvp.Value选择sub.First@潘迪塔:有几个答案建议你使用。GroupBy…ToDictionary。。。但是,托卢库普。。。这其实是一种更简单的方法。通过将主题对象存储在源词典中,可以避免在.ToLookup/.ToDictionary的值选择器中进行令人困惑的线性搜索。@Martin:查找是一种很好的方法…简洁的解决方案..:Thanx用于回复。就迂回而言,有一些旧藏品是无法更改的,因此迂回。我认为这又错过了一步:结果应该包含主题,不是他们的代码。@Martin Liversage:我需要Subject类的对象,不仅仅是Subject代码。@Martin:我使用了下面的代码,但在任何给定代码的分组中,我得到的元素计数为4,而我只有三个Subject。它显示为NULL的最后一个元素。我的代码是:var tSbList=RoleList.ToLookupkvp=>kvp.Key,kvp=>listSub中的from sub,其中sub.code.equalsvp.Value选择sub.First@潘迪塔:有几个答案建议你使用。GroupBy…ToDictionary。。。但是,托卢库普。。。这其实是一种更简单的方法。通过将主题对象存储在源词典中,可以避免在.ToLookup/.ToDictionary的值选择器中进行令人困惑的线性搜索。@Martin:查找是一种很好的方法…简洁的解决方案..:Thanx用于回复。就迂回而言,有一些旧藏品无法更改,因此迂回。 Key | Value -------+----------------------------- Roll 1 | subject1, subject2, subject3 Roll 2 | subject2, subject3
Student st1 = new Student
{
Name = "John",
RollNo = "Roll 1"
};
Subject sb1 = new Subject
{
Code = "Subject 1"
};
Subject sb2 = new Subject
{
Code = "Subject 2"
};
Subject sb3 = new Subject
{
Code = "Subject 3"
};
// Create the associative dictionary for subjects.
var subjectsByCode = new [] { sb1, sb2, sb3 }.ToDictionary(subject => subject.Code, subject => subject);
// Many-to-many relationship: Student (RollNo) <=> Subject (Code).
List<KeyValuePair<string,string>> roleList = new List<KeyValuePair<string,string>>
{
new KeyValuePair<string, string>(st1.RollNo, sb1.Code),
new KeyValuePair<string, string>(st1.RollNo, sb2.Code),
new KeyValuePair<string, string>(st1.RollNo, sb3.Code)
};
// Create Student RollNo => List of Subjects dictionary.
Dictionary<string, List<Subject>> studentRollNoToSubjects = roleList
.GroupBy(pair => pair.Key) // Group by RollNo
.ToDictionary(group => group.Key, // Key of the dictionary is RollNo.
group => group.Select(pair => subjectsByCode[pair.Value]).ToList()); // List of subjects is created using subjects-by-code dictionary.