Concat三个列表由入口

时间:2014-08-26 12:57:06

标签: c#

我只是想知道是否可以通过条目连接列表;

 List One  Concat   List Two  Concat    List Three
Entry One   ->      Entry Two  ->       Entry Three 
Entry One   ->      Entry Two  ->       Entry Three 
Entry One   ->      Entry Two  ->       Entry Three 

我问的原因是我有三个列表循环我需要的程序的不同部分的值。我需要一种方法来按照它们在三个列表中出现的顺序连接条目。循环每个列表的代码是;

List<string> QualificationList = new List<string>();
            List<string> SubjectList = new List<string>();
            List<string> GradeList = new List<string>();

            foreach (XmlNode QualificationNode in GetQualification)
            {
                GetQualificationType = QualificationNode.InnerText;
                QualificationList.Add(GetQualificationType);
            }

            foreach (XmlNode SubjectNode in GetSubject)
            {
                GetSubjects = SubjectNode.InnerText;
                SubjectList.Add(GetSubjects);
            }

            foreach (XmlNode node in GetGrade)
            {
                GetGrades = node.InnerText;
                GradeList.Add(GetGrades);
            }

我只是想知道这是否可能,如果不是我怎么能收集我需要连接或stringbuilder正确的信息。感谢您提供的任何帮助

2 个答案:

答案 0 :(得分:1)

您的代码可以简化为:

QualificationList.AddRange(GetQualification.Select(item => item.InnerText));
SubjectList.AddRange(GetSubject.Select(item => item.InnerText));
GradeList.AddRange(GetGrade.Select(item => item.InnerText));

使用AddRange可以保护您免受循环影响,Select方法会在文本显示的顺序内返回文本。

答案 1 :(得分:1)

我想你想要Zip

var concatList = QualificationList.Zip(SubjectList, (q,s) => new {q, s})
                                  .Zip(GradeList, (qs, g) => new {qs.q, qs.s, qs.g})

这将为您提供一个包含三个属性的匿名类型:q(资格认证),s(主题)和g(成绩)。如果要将它们连接成一个字符串,只需将其与Select

一起投影
                                  .Select( qsg => string.Format("{0} {1} {2}", q, s, g);

如果需要,您还可以使用投影替换每个xxxList;它只会增加Linq语句的复杂性(并且可能使调试更加困难):

var concatList = GetQualification.Select(node => node.InnerText)
                                 .Zip(GetSubject.Select(node => node.InnerText),
                                      (q,s) => new {q, s})
                                 .Zip(GetGrade.Select(node => node.InnerText),
                                      (qs, g) => new {qs.q, qs.s, qs.g})