我正在尝试将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保持为空。有什么帮助吗?
答案 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)
根据指定here,Concat
生成新序列,而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
方法。