开发中,需要将IEnumerable<T>类型变量转换成ObservableCollection<T>类型变量。
一开始,尝试以下方法实现:
//错误方法:
List<int> fromList =new List<int>();
for(int i=0;i<5;i++)
{
fromList.Add(i);
}
ObservableCollection<int> toList = new ObservableCollection<int>();
toList = fromList;
很显然,这种直接使用类型隐式转换的方法是不可行的,因为List<int>类与ObservableCollection<int>类并不满足类型隐式转换的前提条件。我们都知道:子类可以隐式转换为父类,那么查看List<int>类与ObservableCollection<int>类就很容易发现,两者不存在这种继承关系。
于是,采用下面的方式来实现:
//正确方法:
foreach(int i in fromList)
{
toList.Add(i);
}
这种做法是可行的。
在有些项目中,会有人将这样的转换方法抽取成静态类的静态方法,代码如下:
//静态转换方法
public static class ConvertHelper
{
public static ObservableCollection<T> ConvertToObservableCollection<T>(IEnumerable<T> from)
{
ObservableCollection<T> to = new ObservableCollection<T>();
foreach (var f in from)
{
to.Add(f);
}
return to;
}
}
这时,任何需要此种转换的地方都可以按照下面的方式来调用这个转换方法:
toList = ConvertHelper.ConvertToObservableCollection(fromList);
当然,还可以将上面的静态方法改写成扩展方法,代码如下:
//转换的扩展方法形式
public static class AdvanceConvertHelper
{
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> from)
{
ObservableCollection<T> to = new ObservableCollection<T>();
foreach (var f in from)
{
to.Add(f);
}
return to;
}
}
这时,可以按照下面的方式来调用这个转换方法:
toList = fromList.ToObservableCollection();
前面的方法本质上都是通过遍历源集合fromList元素将其加入目标集合toList来完成转换操作的。
其实,还有一个比较简单的方法,代码如下:
//最简单的方法:
ObservableCollection<int> toList = new ObservableCollection<int>(fromList);
此方法主要是利用了ObservableCollection<T>类的构造函数:
public ObservableCollection(IEnumerable<T> collection)
该构造函数可以接收一个IEnumerable<T>的参数,在其内部将其转换成ObservableCollection<T>,如果有机会查看.Net的源码,你会发现在构造函数中其实也是通过遍历元素来完成转换造作的(万变不离其宗啊)。
扩展阅读:
C#扩展方法 扩你所需 C# Linq扩展方法应用 C#扩展方法调用简析 扩展方法入门 C#扩展方法初探