将类的对象添加到基类列表的最佳Linq语法

时间:2014-02-12 13:42:29

标签: c# linq

当我内部的对象是继承我的基类的类时,我试图创建一个基类列表。我是最快的语法。

我有以下课程

public class ObjectA : BaseObject
{
    public string ObjectAName {get;set;}
}

我的方法是:

    private List<BaseObject> GetList()
    {
        List<ObjectA> aList = MyData.ObjectA.FindAll(delegate(ObjectA my) { return my.ObjectAName == "Harold"; });
        List<BaseObject> baseList = new List<BaseObject>();
        foreach(ObjectA obj in aList)
        {
            baseList.Add(obj);
        }
        return baseList;
    }

是否有更直接的linq语法?

4 个答案:

答案 0 :(得分:4)

也许是这样的。

baseList.AddRange(MyData.ObjectA.Where(o=>o.ObjectAName == "Harold"));

或者你也可以这样做

private List<BaseObject> GetList()
{
    return MyData.ObjectA.Where(o=>o.ObjectAName == "Harold").Cast<BaseObject>().ToList();
}

答案 1 :(得分:2)

怎么样:

private List<BaseObject> GetList()
{
    return MyData.ObjectA
        .FindAll(my => my.ObjectAName == "Harold")
        .Cast<BaseObject>()
        .ToList();
}

请注意,FindAll只是List<T>的实例方法,而不是LINQ的一部分。

答案 2 :(得分:0)

只需使用AddRange

 private List<BaseObject> GetList()
            {
                List<ObjectA> aList = MyData.ObjectA.FindAll(delegate(ObjectA my) { return my.ObjectAName == "Harold"; });
                List<BaseObject> baseList = new List<BaseObject>();
                //foreach (ObjectA obj in aList)
                //{
                //    baseList.Add(obj);
                //}
                baseList.AddRange(aList);
                return baseList;
            }

答案 3 :(得分:0)

如果从现有列表创建新列表,另一种方法是使用重载列表构造函数来获取IEnumerable:

private List<BaseObject> GetList()
{
    List<ObjectA> aList = MyData.ObjectA.FindAll(delegate(ObjectA my) { return my.ObjectAName == "Harold"; });
    List<BaseObject> baseList = new List<BaseObject>(aList.OfType<BaseObject>());

    return baseList;
}

话虽如此,目前还不清楚为什么你真的需要一个新的列表,而不是返回一个过滤的IEnumerable,并且根本不需要两个列表中的额外内存指针。这就是为什么创造了产量。