[英]Cannot implicitly convert List<T> to Collection<T>
这是编译器错误(为了便于阅读,略有改动)。
这个总是困惑我。 FxCop告诉我返回List是一件坏事,而且从Collection<T>
派生的类应该更适合作为返回类型。
此外,FxCop表示可以使用List<T>
进行内部数据存储\\操作。 好吧,我明白了,但是我没有得到的是编译器抱怨试图将List<T>
隐式转换为Collection<T>
。 是不是List<T>
更多的接口充电和功能? 为什么要禁止隐式转换?
另一个问题源于上述: new List<int>(some collection<int>)
构造函数是否昂贵?
谢谢,
瓦伦丁瓦西里耶夫
为什么不这样做:
Collection<string> collection = new Collection<string>(theList);
as Collection(IList输入)将List作为构造的一部分。
List<T>
不是从Collection<T>
派生的 - 但它确实实现了ICollection<T>
。 这将是返回类型的更好选择。
至于new List<int>(some collection<int>)
问题 - 它部分取决于集合是什么。 如果它实现ICollection<T>
(在执行时),那么构造函数可以使用其Count
属性创建具有正确初始容量的列表,然后迭代它并添加每个项目。 如果它没有实现ICollection<T>
那么它只相当于:
List<int> list = new List<int>();
foreach (int x in otherCollection)
{
list.Add(x);
}
在一个方便的构造函数中仍然很好,但效率不高 - 它不可能,真的。
我不相信构造函数会对数组做任何狡猾的事情,它可能会使用Array.Copy
或其他只是一次性复制批次而不是迭代。 (同样,如果它是另一个List<T>
它可以获得支持数组并直接复制它。)
List<T>
不从Collection<T>
继承。 干净利落。 除非List<T>
提供操作符隐式转换为Collection<T>
或从Collection<T>
转换,否则您无法执行此操作。 如果可以,我实际建议返回List<T>
,因为我相信规则是这样的:
作为参数接受可能的最不紧缩的接口。 作为返回参数返回可能的最紧缩类型。
这是一个用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时):
旧功能:
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)
.ToList()
,没有必要循环...你可以只做.ToList()
ICollection<T> collection = new Collection<T>();
使用任何方法填充您的集合,当您需要列表时,只需执行以下操作:
List<T> list = collection.ToList();
之后,您可以在列表中使用任何您想要的内容。
有一个很好的编码!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.