这是“列表合并”吗?可利用的代码
本文关键字:可利用 代码 列表 合并 列表合并 这是 | 更新日期: 2023-09-27 18:17:44
我有一个合并两个列表的方法。两个合并的列表是返回列表的子类型对象的列表。我所说的"合并"是指"允许重复"。
所以Sub1和Sub2类型是Sup1类型的子类型。
我的代码
var listSub1 = new List<Sub1>(); //With some content added..
var listSub2 = new List<Sub2>(); //With content too..
var listToReturn = new List<Sup1>();
listToReturn.AddRange(listSub1.Select(item => item as Sup1).ToList());
listToReturn.AddRange(listSub2.Select(item => item as Sup1).ToList());
return listeToReturn;
它工作得很好,但我想知道这是否是合并和转换列表的最佳方式。
你可以写
var newList =
listSub1.Cast<Sup1>()
.Concat(listSub2.Cast<Sup1>()).ToList();
注意,使用Union
是不正确的,因为它会确保"相等"的对象只出现一次。
return listSub1.Cast<Sup1>().Concat(list2.Cast<Sup1>()).ToList()
var result = listSub1.AddRang(listSub2 ).Cast<Sup1>().ToList()
为什么不直接使用LINQ的Union呢?
假设我不需要与旧版本保持二进制兼容性,我将返回类型重新定义为IEnumerable<Sub1>
并将其编码为:
return listSub1.Concat(listSub2);
如果一个调用者真的需要一个列表,它可以调用.ToList()
本身,但一个不需要列表的调用者(例如,它只是通过foreach
)不需要遭受.ToList()
的延迟和内存使用。
仅在需要时使用.ToList()
作为单个更改是一个微小的选择,但作为编码习惯可以开始显著地增加。
你可以用linq:
var listToReturn = listSub1.Cast<Sup1>().Concat(listSub2).ToList();
edit:匹配已编辑的问题