c# - 如何合并两个或多个实现相同接口(interface)的列表

标签 c# c#-3.0

假设我有 2 个列表

public List<TypeA> TypeARecords {get; set;}
public List<TypeB> TypeBRecords {get; set;}

TypeA 和 TypeB 都实现了相同的接口(interface)(比如 IBaseRecord)

现在我有一个返回所有记录列表的只读属性

public List<IBaseRecord> AllRecords
{
    get 
    {
        var allRecs = new List<IBaseRecord>();

        foreach ( var rec in TypeARecords)
            allRecs.Add(rec);

        foreach ( var rec in TypeBRecords)
            allRecs.Add(rec);

        return allRecs;
    }
}

这行得通,但我相信有更有效或更聪明的方法来做同样的事情 有任何想法吗?

最佳答案

您可以制作一个返回列表中项目的迭代器:

public IEnumerable<IBaseRecord> GetAllRecords {
  foreach (var rec in TypeARecords) {
    yield return rec;
  }
  foreach (var rec in TypeBRecords) {
    yield return rec;
  }
}

这样您就不必创建包含所有项目的新列表,它只会从现有列表中读取。

编辑:
正如 Stan R. 建议的那样,您可以使用 ToList 方法创建列表的副本:

List<IBaseRecord> work = obj.GetAllRecords().ToList();

这比拥有返回新列表的属性要好一些,因为列表的所有权变得更加清晰。此外,属性不应该做创建列表这样繁重的工作,至少不是每次读取属性时。

关于c# - 如何合并两个或多个实现相同接口(interface)的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792503/

相关文章:

c# - 如何获得扩展方法来更改原始对象?

c# - 仅在一个类中设置泛型类型

c# - .net core 测试数据库集

c# - 当路径中存在句点时找不到 ServiceStack 处理程序

.net - C# 中的扩展方法重载,它有效吗?

c# - 参数类型 'void' 不可分配给参数类型 'System.Action'

linq-to-sql - Compact Framework 中的 LINQ To SQL

c# - 是否可以使用 Dotfuscator 更改字符串?

asp.net - 如何在aspx页面中添加winforms用户控件

c# - C# 中的数据网格访问