如何将IList转换为iEnumerable以尊重接口

本文关键字:接口 iEnumerable IList 转换 | 更新日期: 2023-09-27 18:28:14

我使用的是API,在这里我实现了一个接口,该接口具有返回IEnumerable的方法。

我在实现中将集合构建为List,因为我需要.Add()方法。

然后我可以将其转换为IEnumerable吗?

如何将IList转换为iEnumerable以尊重接口

由于List<T>同时实现IEnumerable<T>IEnumerable,如果您只需要将其作为方法的返回值,则可以直接返回,例如:

public IEnumerable<string> GetData()
{
    List<string> myList = new List<string>{" data"};
    return myList; //works
}

当您调用该方法时,从另一端得到的将是指向List<T>对象的IEnumerable<T>引用。

这意味着用户可以在任何可以使用IEnumerable<T>的地方使用结果,但简单的强制转换也可以暴露内部List<T>,从而允许修改数据。例如:

IEnumerable<string> result = GetData();
Console.Write(result.First()); // " data";
List<string> resultAsList = (result as List<string>);
resultAsList.Insert(0, "other data");
Console.Write(result.First()); // "other data";

如果您不想更改结果,可以使用.AsReadOnly方法返回一个仍然是IEnumerable<T>ReadOnlyCollection<T>,如下所示:

public IEnumerable<string> GetData()
{
    List<string> myList = new List<string>{" data"};
    return myList.AsReadOnly();
}

正如Sweko所提到的,您可以简单地返回列表,但如果您不希望从外部修改列表,您可以在列表上调用AsEnumerable以在外部公开IEnumerable

public IEnumerable<string> GetData()
{
   List<string> yourList = new List<string>();
   return yourlist.AsEnumerable();
}
相关文章: