如何合并2个或更多列表实现相同的接口

Mic*_* D. 1 c# c#-3.0

假设我有2个列表

public List<TypeA> TypeARecords {get; set;}
public List<TypeB> TypeBRecords {get; set;}
Run Code Online (Sandbox Code Playgroud)

TypeA和TypeB都实现相同的接口(比如说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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Guf*_*ffa 7

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

public IEnumerable<IBaseRecord> GetAllRecords {
  foreach (var rec in TypeARecords) {
    yield return rec;
  }
  foreach (var rec in TypeBRecords) {
    yield return rec;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

List<IBaseRecord> work = obj.GetAllRecords().ToList();
Run Code Online (Sandbox Code Playgroud)

这比具有返回新列表的属性要好一些,因为列表的所有权变得更清楚.此外,属性不应该像创建列表那样繁重,至少不是每次都读取属性.