Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并两个列表和一个词典以创建单个词典_C#_.net_Linq_C# 4.0 - Fatal编程技术网

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.