这是“列表合并”吗?可利用的代码

本文关键字:可利用 代码 列表 合并 列表合并 这是 | 更新日期: 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:匹配已编辑的问题