List <t>动态连接

时间:2017-01-09 08:42:41

标签: c# dictionary concatenation generic-list

我正在尝试将List<>联系如下 -

 List<Student> finalList = new List<Student>();
 var sortedDict = dictOfList.OrderBy(k => k.Key);
 foreach (KeyValuePair<int, List<Student>> entry in sortedDict) {          
     List<Student> ListFromDict = (List<Student>)entry.Value;
     finalList.Concat(ListFromDict);
 }

但是没有连接发生。 finalList保持为空。有什么帮助吗?

5 个答案:

答案 0 :(得分:7)

Concat的调用不会修改原始列表,而是返回一个新列表 - 或者完全准确:它返回一个IEnumerable<string>,它将生成两个列表连接的内容,修改其中任何一个。

您可能希望使用符合您需要的AddRange

List<Student> ListFromDict = (List<Student>)entry.Value;
finalList.AddRange(ListFromDict);

甚至更短(在一行代码中):

finalList.AddRange((List<Student>)entry.Value);


由于entry.Value已经是List<Student>类型,因此您可以使用以下内容:

finalList.AddRange(entry.Value);

答案 1 :(得分:7)

其他答案解释了为什么Concat没有帮助你 - 但他们都保留了原来的循环。没有必要 - LINQ让你满意:

List<Student> finalList = dictOfList.OrderBy(k => k.Key)
                                    .SelectMany(pair => pair.Value)
                                    .ToList();

要清楚,这将替换整个现有代码,而不仅仅是循环体。

更简单:)每当你发现自己使用的foreach循环除了构建另一个集合之外什么都不做,值得看看你是否可以使用LINQ来消除这个循环。

答案 2 :(得分:4)

您可能需要阅读Enumerable.Concat上的文档:

  

返回值
  键入:System.Collections.Generic.IEnumerable
  包含两个输入序列的连接元素的IEnumerable。

所以你可能想要使用包含新元素的返回值。

作为替代方案,您可以使用List.AddRange,其中将指定集合的​​元素添加到List 的末尾。

另外,您还可以通过简单的LINQ查询实现目标:

var finalList = dictOfList.OrderBy(k => k.Key)
                          .SelectMany(k => k.Value)
                          .ToList();

答案 3 :(得分:3)

根据指定hereConcat生成新序列,而AddRange实际上将元素添加到列表中。因此,您应该将其重写为:

List<Student> finalList = new List<Student>();
var sortedDict = dictOfList.OrderBy(k => k.Key);
foreach (KeyValuePair<int, List<Student>> entry in sortedDict) {          
    List<Student> ListFromDict = (List<Student>)entry.Value;
    finalList.AddRange(ListFromDict);
}

此外,您可以通过省略对List<T>对象的强制转换来提高效率,因为entry.Value已经是List<T>(技术上只需要IEnumerable<T> }):

var sortedDict = dictOfList.OrderBy(k => k.Key);
foreach (KeyValuePair<int, List<Student>> entry in sortedDict) {
    finalList.AddRange(entry.Value);
}

答案 4 :(得分:1)

Concat方法不会修改原始集合,而是返回带有连接结果的全新集合。因此,请尝试finalList = finalList.Concat(ListFromDict)或使用修改目标列表的AddRange方法。