0

我正在使用一个 API,我在其中实现了一个接口,该接口有一个返回IEnumerable.

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

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

4

2 回答 2

9

由于List<T>实现了IEnumerable<T>and IEnumerable,如果你只需要它作为方法的返回值,你可以直接返回它,例如:

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

另一方面,当您调用该方法时,您得到的将是IEnumerable<T>指向List<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方法返回ReadOnlyCollection<T>仍然是a 的 a IEnumerable<T>,如下所示:

public IEnumerable<string> GetData()
{
    List<string> myList = new List<string>{" data"};
    return myList.AsReadOnly();
}
于 2013-08-20T07:45:43.790 回答
4

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

public IEnumerable<string> GetData()
{
   List<string> yourList = new List<string>();
   return yourlist.AsEnumerable();
}
于 2013-08-20T07:47:40.933 回答