我有一个包含集合的类。我想提供一个返回集合内容的方法或属性。如果调用类可以修改单个对象,但我不希望它们在实际集合中添加或删除对象,这是可以的。我一直在将所有对象复制到一个新列表,但现在我想我可以将列表作为IEnumerable<>返回。
在下面的简化示例中,GetListC是返回集合的只读版本的最佳方法吗?
public class MyClass
{
private List<string> mylist;
public MyClass()
{
mylist = new List<string>();
}
public void Add(string toAdd)
{
mylist.Add(toAdd);
}
//Returns the list directly
public List<String> GetListA
{
get
{
return mylist;
}
}
//returns a copy of the list
public List<String> GetListB
{
get
{
List<string> returnList = new List<string>();
foreach (string st in this.mylist)
{
returnList.Add(st);
}
return returnList;
}
}
//Returns the list as IEnumerable
public IEnumerable<string> GetListC
{
get
{
return this.mylist.AsEnumerable<String>();
}
}
}
答案 0 :(得分:26)
答案 1 :(得分:2)
只需使用ReadOnlyCollection类,从.NET 2.0开始支持它
答案 2 :(得分:0)
使用通用的ReadOnlyCollection类(Collection.AsReadOnly()
)。当底层集合发生变化时,它不会复制任何可能有一些奇怪结果的对象。
var foo = new List<int> { 3, 1, 2 };
var bar = foo.AsReadOnly();
foreach (var x in bar) Console.WriteLine(x);
foo.Sort();
foreach (var x in bar) Console.WriteLine(x);
但如果你不想要副本,这是最好的解决方案。
答案 3 :(得分:-2)
我更喜欢返回IEnumerable,但你不需要强制转换。只是做
public IEnumerable<string> StringList { get { return myList; }
List<string>
是IEnumerable<string>