不能将List <T>隐式转换为Collection <T>
这是一个编译器错误(为了可读性而稍作修改)。
这一个总是困惑我。 FxCop告诉这是一个不好的事情返回列表和派生从Collection<T>
应该是可取的返回types。
此外,FxCop说可以使用List<T>
进行内部数据存储\操作。 好吧,我明白了,但我没有得到的是编译器抱怨尝试隐式转换List<T>
到Collection<T>
。 是不是更多的界面充电和function? 为什么禁止隐式转换?
而另一个源于上面的问题是: new List<int>(some collection<int>)
构造函数是否昂贵?
谢谢,
瓦伦丁·瓦西里耶夫
List<T>
不是从Collection<T>
派生的,但是它实现了ICollection<T>
。 这将是更好的select返回types。
至于new List<int>(some collection<int>)
问题,它部分取决于集合是什么。 如果它实现了ICollection<T>
(在执行时),那么构造函数可以使用它的Count
属性创build具有正确初始容量的列表,然后迭代并添加每个项目。 如果它没有实现ICollection<T>
那么它就等于:
List<int> list = new List<int>(); foreach (int x in otherCollection) { list.Add(x); }
仍然很高兴有一个方便的构造,但不是非常有效 – 它不能,真的。
我不相信构造函数会对数组做任何狡猾的操作,它可能会使用Array.Copy
或其他任何方法来Array.Copy
复制整个区域,而不是一次次迭代。 (同样,如果它是另一个List<T>
它可以得到支持数组,并直接复制)。
为什么不只是做到以下几点:
Collection<string> collection = new Collection<string>(theList);
作为集合(IListinput)采取列表作为一部分的build设。
List<T>
不从Collection<T>
inheritance。 干净利落。 除非List<T>
提供一个操作符隐式地转换为Collection<T>
,否则不能这样做。 如果可以的话,我实际上会build议返回List<T>
,因为我相信规则是这样的:
接受作为参数的可能性最小的紧缩接口。 作为返回参数返回可能的最紧缩types。
这是一个用C#3.0编写的通用扩展方法,用于将List<T>
转换为Collection<T>
using System.Collections.Generic; using System.Collections.ObjectModel; public static class ExtensionMethods { public static Collection<T> ToCollection<T>(this List<T> items) { Collection<T> collection = new Collection<T>(); for (int i = 0; i < items.Count; i++) { collection.Add(items[i]); } return collection; } }
它是这样使用…
List<string> entities = new List<string>(); entities.Add("Value 1"); entities.Add("Value 2"); entities.Add("Value 3"); entities.Add("Value 4"); Collection<string> convertedEntities = entities.ToCollection<string>();
这是你如何从List<T>
转换为Collection<T>
(同时使用LINQ):
旧function:
public List<Employee> GetEmployee(int id) { return ( from e in MyDataContext.Employees select new Employee() { e.empId = id } ).ToList(); }
转换后:
using System.Collection.ObjectModel; public Collection<Employee> GetEmployee(int id) { return new Collection<Employee>( (from e in MyDataContext.Employees select new Employee() { e.empId = id } ).ToList() as IList<Employee> ); }
你可以使用下面的
public class EmployeeCollection : Collection<Employee> { public EmployeeCollection(IList<Employee> list) : base(list) {} public EmployeeCollection() : base() {} }
像这样使用这个类
EmployeeCollection employeeCollection = new EmployeeCollection(list)