不使用LINQ强制转换对象列表

时间:2011-04-19 08:22:10

标签: c# .net .net-2.0

从我在这里的问题:Cast in List object

我使用LINQ接受了答案:

myA = myB.Cast<A>().ToList();

我有一个问题:我们有任何其他解决方案而不使用LINQ,因为我的应用程序使用的是.NET Framework 2.0。

更新 如果我有几个类myB,myC,myD,myE,...派生自myA,我需要一个可以将列表转换为列表的函数(T可能是myB或myC或myD,...),以避免重复相同的代码。 The function input is a list<T> and the function output is a list<myA>.

感谢。

3 个答案:

答案 0 :(得分:5)

一个简单的foreach将会起作用(为了便于阅读,我已将类命名为Foo和Bar)

myFoos = new List<Foo>();
foreach (Bar bar in myBars)
{
  myFoos.Add((Foo)bar);
}

问题编辑后:

要将多个子类的列表转换为基类,我将创建一个名为BaseCollection的类,而不是从List继承的类,因为通常还需要列表中的其他一些操作。一些有用的方法可能是:

 public class BaseCollection : List<Base>
 {
    public static BaseCollection ToBase<T>(IEnumerable<T> source) where T: Base
    {
       BaseCollection result = new BaseCollection();
       foreach (T item in source)
       {
          result.Add(item);
       }
       return result;
     }

    public static List<T> FromBase<T>(IEnumerable<Base> source) where T: Base
    {
       List<T> result = new List<T>();
       foreach (Base item in source)
       {
          result.Add((T)item);
       }
       return result;
     }


    public static List<T> ChangeType<T, U>(List<U> source) where T: Base where U:Base
    {        
        List<T> result = new List<T>();        
        foreach (U item in source)        
        {           
            //some error checking implied here
            result.Add((T)(Base) item);        
        }        
        return result;      
    }  

    ....
    // some default printing
    public void Print(){...}         
    ....
    // type aware printing
    public static void Print<T>(IEnumerable<T> source) where T:Base {....}
    ....
 }

这将使我能够轻松地将任何后代转换为基类集合,并使用它们,如下所示:

List<Child> children = new List<Child>();
children.Add(new Child { ID = 1, Name = "Tom" });
children.Add(new Child { ID = 2, Name = "Dick" });
children.Add(new Child { ID = 3, Name = "Harry" });

BaseCollection bases = BaseCollection.ToBase(children);
bases.Print();

List<Child> children2 = BaseCollection.FromBase<Child>(bases);
BaseCollection.Print(children2);

答案 1 :(得分:2)

对于.NET 2.0,您可以编写自己的Cast方法,使用Linq代码作为指导:

public static class EnumerableHelper
{
    public static IEnumerable<TResult> Cast<TResult>(IEnumerable source)
    {
        IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
        if (enumerable != null) return enumerable;
        if (source == null) throw new ArgumentNullException("source");        
        foreach(object element in source)
        {
            yield return (TResult) element;
        }
    }
}

然后按如下方式使用它:

myA = new List<A>(EnumerableHelper.Cast<A>(myB));   

答案 2 :(得分:1)

    public static List<B> Cast<A,B>(List<A> aLIst) where A : B
    {
        List<B> ret = new List<B>( );

        foreach (A a in aLIst)
        {
            ret.Add(a);
        }

        return ret;
    }