我有一个foreach循环,读取一种类型的对象列表,并产生另一种类型的对象列表。有人告诉我,lambda表达式可以实现相同的结果。

var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}

当前回答

如果你知道你想从List<T1>转换到List<T2>,那么List<T>。ConvertAll将比Select/ToList更有效,因为它知道开始时的确切大小:

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });

在更一般的情况下,当您只知道源为IEnumerable<T>时,使用Select/ToList是可行的方法。你也可以争辩说,在LINQ的世界里,更习惯的开始是……但至少有必要了解ConvertAll选项。

其他回答

如果需要在从一个列表映射到另一个列表时进行强制转换,则可以从convertall调用一个函数来测试强制转换。

public int StringToInt(String value)
        {
            try
            {
                return Int32.Parse(value);
            }
            catch (Exception ex)
            {
                return -1;
            }
        }
        [Fact]
        public async Task TestConvertAll()
        { 
            List<String> lstString = new List<String>{"1","2","3","4","5","6","7","8","9","10" };

            List<int> lstInt = lstString.ConvertAll(new Converter<String, int>(StringToInt));
            foreach (var item in lstInt)
            {
                output.WriteLine("{0}", item);
            }
            if (lstInt.Count()>0) {
                Assert.True(true);
            }
        }
var list1 = new List<Type1>();
var list2 = new List<Type2>();

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));

如果你知道你想从List<T1>转换到List<T2>,那么List<T>。ConvertAll将比Select/ToList更有效,因为它知道开始时的确切大小:

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });

在更一般的情况下,当您只知道源为IEnumerable<T>时,使用Select/ToList是可行的方法。你也可以争辩说,在LINQ的世界里,更习惯的开始是……但至少有必要了解ConvertAll选项。

如果需要使用函数进行类型转换:

var list1 = new List<Type1>();
var list2 = new List<Type2>();

list2 = list1.ConvertAll(x => myConvertFuntion(x));

我的自定义函数是:

private Type2 myConvertFunction(Type1 obj){
   //do something to cast Type1 into Type2
   return new Type2();
}

或者使用构造函数& linq选择:

public class TargetType {
  public string Prop1 {get;set;}
  public string Prop1 {get;set;}

  // Constructor
  public TargetType(OrigType origType) {
    Prop1 = origType.Prop1;
    Prop2 = origType.Prop2;
  }
}

var origList = new List<OrigType>();
var targetList = origList.Select(s=> new TargetType(s)).ToList();  

Linq线条更柔和!: -)