对象列表转换的最佳方法是什么

时间:2014-11-12 13:05:36

标签: c# list casting type-conversion

是否可以让我的代码更具性能?我认为必须有比“foreach”更好的方式。

我的对象:

public class FirstObject{
    public string Name { get; set; }
    public decimal DecimalProp { get; set; }
}

public class SecondObject{
    public string Name { get; set; }
    public string StringProp { get; set; }
}

这是我的代码:

List<SecondObject> secondObjectList = GetAllSecondObjects(); //This method returns tens of data

List<FirstObject> firstObjectList = new List<FirstObject>();

foreach(var item in secondObjectList){
    FirstObject obj = new FirstObject
    {
        Name = item.Name,
        DecimalProp = Convert.ToDecimal(item.StringProp)
    };
    firstObjectList.Add(obj);
}

感谢。

3 个答案:

答案 0 :(得分:2)

为了加快速度(在多核系统上),你可以让它并行运行:

secondObjectList.AsParallel().ForAll(s =>
    {
        FirstObject obj = new FirstObject
        {
            Name = item.Name,
            DecimalProp = Convert.ToDecimal(item.StringProp)
        };
        firstObjectList.Add(obj);
    });

或者使用LINQ作为Ehsan建议:

var firstObjectList  = secondObjectList.AsParallel().Select(s => new FirstObject
                           {
                               Name = s.Name,
                               DecimalProp = Convert.ToDecimal(s.StringProp)
                           });

除此之外,你可以做的事情不多,因为工作需要以某种方式完成,而简单循环的开销相当小......

P.S。:请记住,AsParellel可以(很可能会)改变列表中对象的顺序。

答案 1 :(得分:1)

如果您的类非常相似,您可以进行继承并简化代码:

    public class SecondObject : FirstObject
    {
        private string _stringProp;
        public string StringProp {
            get { return _stringProp; }
            set
            {
                _stringProp = value;
                DecimalProp = Convert.ToDecimal(value);
            }
        }
    }

然后说

var secondObjectList = GetAllSecondObjects(); //This method returns tens of data

var firstObjectList = secondObjectList.Cast<FirstObject>().ToList();

我认为它有更好的表现。

答案 2 :(得分:0)

如果你想穿上衬里,你可以使用LINQ:

List<SecondObject> secondObjectList = GetAllSecondObjects(); //This method returns tens of data


var firstObjectList  = secondObjectList.Select(x=> new FirstObject
                           {
                              Name = x.Name,
                              DecimalProp = Convert.ToDecimal(x.StringProp)
                            }).ToList();