C# 将类实例作为值添加到字典

C# 将类实例作为值添加到字典,c#,xml,C#,Xml,我有一个xml文件“Sample.xml” 对于上述文件,此查询工作正常 但是,如果文件中有多个同名元素,或者某个元素没有“start”和“end”属性,则在 执行查询 我对以下几行有意见 grp.Attributes("Start").ToList()[0].Value.ToString(), grp.Attributes("End").ToList()[0].Value.ToString() 请给我一个更好的方法 我需要在listView中填充口述的内容 S.no

我有一个xml文件“Sample.xml”

对于上述文件,此查询工作正常

但是,如果文件中有多个同名元素,或者某个元素没有“start”和“end”属性,则在 执行查询

我对以下几行有意见

     grp.Attributes("Start").ToList()[0].Value.ToString(),
     grp.Attributes("End").ToList()[0].Value.ToString()
请给我一个更好的方法

我需要在listView中填充口述的内容

S.no       Child              Siblings                Additional Siblings            Missing Siblings

 1         FirstChild         Test1,Test2             Add_Test_1,Add_Test_2           Miss_Test_1,Miss_Test_2

 2         SecondChild        Test3,Test4

 3         ThirdChild         Test5,Test6
现在我用for循环来实现这个


请给我一个更好的方法来实现这一点。

鉴于您编写查询的方式,我不明白如果您有两个同名的
元素,为什么会出现异常。如果有的话,它们的数据将被合并到字典中的一个键实例中。要修复当
Start
属性不存在时收到的异常,只需执行测试
?:
查看是否从属性查询返回了结果。也就是说,下面的代码应该适用于您,并附带免责声明,这并不意味着它是最佳实践。在很多方面,我自己也是LINQ新手

Dictionary<string, SampleClass> dict =
    (from element in xDoc.Descendants("Child")
              group element by element.Attribute("Name").Value
                  into kGrp
                  select kGrp)
            .ToDictionary(grp => grp.Key,
            grp => new SampleClass
            {
                Start = grp.Attributes("Start").Count() > 0
                        ? grp.Attributes("Start")
                             .ToList()[0].Value.ToString()
                        : String.Empty
                ,End = grp.Attributes("End").Count() > 0
                        ? grp.Attributes("End")
                             .ToList()[0].Value.ToString()
                        : String.Empty
                ,Siblings =
                    grp.Descendants("Sibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
                ,AdditionalSiblings =
                    grp.Descendants("AdditionalSibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
                ,MissingSiblings =
                    grp.Descendants("MissingSibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
            });
Dictionary dict=
(来自xDoc.substands(“子”)中的元素)
按元素对元素进行分组。属性(“名称”)。值
加入kGrp
选择kGrp)
.ToDictionary(grp=>grp.Key,
grp=>newsampleclass
{
Start=grp.Attributes(“Start”).Count()>0
?组属性(“开始”)
.ToList()[0].Value.ToString()
:String.Empty
,End=grp.Attributes(“End”).Count()>0
?组属性(“结束”)
.ToList()[0].Value.ToString()
:String.Empty
,兄弟姐妹=
grp.后代(“兄弟姐妹”)
.属性(“名称”)
.Select(l_Temp=>l_Temp.Value).ToList()
,额外的兄弟姐妹=
grp.后代(“额外兄弟姐妹”)
.属性(“名称”)
.Select(l_Temp=>l_Temp.Value).ToList()
,失去兄弟姐妹=
grp.后代(“缺失兄弟姐妹”)
.属性(“名称”)
.Select(l_Temp=>l_Temp.Value).ToList()
});

考虑到您编写查询的方式,如果有两个同名的
子元素,我不明白为什么会出现异常。如果有的话,它们的数据将被合并到字典中的一个键实例中。要修复当
Start
属性不存在时收到的异常,只需执行测试
?:
查看是否从属性查询返回了结果。也就是说,下面的代码应该适用于您,并附带免责声明,这并不意味着它是最佳实践。在很多方面,我自己也是LINQ新手

Dictionary<string, SampleClass> dict =
    (from element in xDoc.Descendants("Child")
              group element by element.Attribute("Name").Value
                  into kGrp
                  select kGrp)
            .ToDictionary(grp => grp.Key,
            grp => new SampleClass
            {
                Start = grp.Attributes("Start").Count() > 0
                        ? grp.Attributes("Start")
                             .ToList()[0].Value.ToString()
                        : String.Empty
                ,End = grp.Attributes("End").Count() > 0
                        ? grp.Attributes("End")
                             .ToList()[0].Value.ToString()
                        : String.Empty
                ,Siblings =
                    grp.Descendants("Sibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
                ,AdditionalSiblings =
                    grp.Descendants("AdditionalSibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
                ,MissingSiblings =
                    grp.Descendants("MissingSibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
            });
Dictionary dict=
(来自xDoc.substands(“子”)中的元素)
按元素对元素进行分组。属性(“名称”)。值
加入kGrp
选择kGrp)
.ToDictionary(grp=>grp.Key,
grp=>newsampleclass
{
Start=grp.Attributes(“Start”).Count()>0
?组属性(“开始”)
.ToList()[0].Value.ToString()
:String.Empty
,End=grp.Attributes(“End”).Count()>0
?组属性(“结束”)
.ToList()[0].Value.ToString()
:String.Empty
,兄弟姐妹=
grp.后代(“兄弟姐妹”)
.属性(“名称”)
.Select(l_Temp=>l_Temp.Value).ToList()
,额外的兄弟姐妹=
grp.后代(“额外兄弟姐妹”)
.属性(“名称”)
.Select(l_Temp=>l_Temp.Value).ToList()
,失去兄弟姐妹=
grp.后代(“缺失兄弟姐妹”)
.属性(“名称”)
.Select(l_Temp=>l_Temp.Value).ToList()
});

不能使用词典,必须使用查找集合

字典要求每个键都有一个到唯一值的1-1映射

您要查找的是查找集合


有关更多信息,请参阅。

您不能使用字典,必须使用查找集合

字典要求每个键都有一个到唯一值的1-1映射

您要查找的是查找集合


有关更多信息,请参见。

您需要了解类和对象之间的区别。您正在尝试添加对象(类的实例)。您没有尝试添加类。您需要了解类和对象之间的区别。您正在尝试添加对象(类的实例)。您没有试图添加类。@Pramodh我建议您将问题拆分。你已经有了相当多的代码墙,我甚至没有注意到第二部分,直到我来查看你的评论。@Pramodh我建议把你的问题分开。你已经有了相当多的代码墙,我甚至没有注意到第二部分,直到我来检查你的评论。
     grp.Attributes("Start").ToList()[0].Value.ToString(),
     grp.Attributes("End").ToList()[0].Value.ToString()
S.no       Child              Siblings                Additional Siblings            Missing Siblings

 1         FirstChild         Test1,Test2             Add_Test_1,Add_Test_2           Miss_Test_1,Miss_Test_2

 2         SecondChild        Test3,Test4

 3         ThirdChild         Test5,Test6
Dictionary<string, SampleClass> dict =
    (from element in xDoc.Descendants("Child")
              group element by element.Attribute("Name").Value
                  into kGrp
                  select kGrp)
            .ToDictionary(grp => grp.Key,
            grp => new SampleClass
            {
                Start = grp.Attributes("Start").Count() > 0
                        ? grp.Attributes("Start")
                             .ToList()[0].Value.ToString()
                        : String.Empty
                ,End = grp.Attributes("End").Count() > 0
                        ? grp.Attributes("End")
                             .ToList()[0].Value.ToString()
                        : String.Empty
                ,Siblings =
                    grp.Descendants("Sibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
                ,AdditionalSiblings =
                    grp.Descendants("AdditionalSibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
                ,MissingSiblings =
                    grp.Descendants("MissingSibling")
                        .Attributes("Name")
                        .Select(l_Temp => l_Temp.Value).ToList()
            });