我正在将类型集合转换为包装类型集合
var buying = ord.Buying == null ? null : ord.Buying.Any() ? ord.Buying.Select<PurchasedBox, XXX.PurchasedBox>(x => x).ToList()
: new List<XXX.PurchasedBox>();
var trading = ord.Trading == null ? null : ord.Trading.Any() ? ord.Trading.Select<TradedBox, XXX.TradedBox>(x => x).ToList()
: new List<XXX.TradedBox>();
还有字典
(Any and null check) foo.ToDictionary(x => x.Key, x => (XXX.Summary)x.Value)
使用隐式转换
转换类型implicit operator XXX.TradedBox(TradedBox box)
这种模式重复serval次数,但我不确定是否可以用隐式转换编写通用助手,例如。
public static List<TE> ConvertList<T, TE>(List<T> list)
{
if (list == null)
return null;
// compilation error cannot convert expression
return list.Any() ? list.Select<T, TE>(x => x).ToList() : new List<TE>();
}
答案 0 :(得分:1)
尝试一下,强制转换为动态类型会产生魔力,但如果传递错误类型(没有约束)则不安全。
public static List<TE> ConvertList<T, TE>(List<T> list)
{
if (list == null)
return null;
return list.Any() ? list.Select<T, TE>(x => (TE)(dynamic)x).ToList() : new List<TE>();
}
注意强>:
我已经进行了性能测试,使用动态成本比使用Func或正常方式(对于此测试)长3倍是正确的。
public static List<TE> ConvertList<T, TE>(List<T> list)
{
return list.Any() ? list.Select<T, TE>(x => (TE)(dynamic)x).ToList() : new List<TE>();
}
public static List<Link> ConvertList1(List<LinkEntity> list)
{
return list.Any() ? list.Select<LinkEntity,Link>(x => x).ToList() : new List<Link>();
}
public static List<TE> ConvertList3<T, TE>(List<T> list,Func<T,TE> fuc)
{
return list.Any() ? list.Select<T, TE>(x => fuc(x)).ToList() : new List<TE>();
}
主要:
var s1 = Stopwatch.StartNew();
var a1 = Enumerable.Repeat(new LinkEntity { A = 10 }, 10000).ToList();
for (int i = 0; i < 10000; i++)
{
var b1 = ConvertList<LinkEntity, Link>(a1);
}
Console.WriteLine(s1.ElapsedMilliseconds);
var s2 = Stopwatch.StartNew();
var a2 = Enumerable.Repeat(new LinkEntity { A = 10 }, 10000).ToList();
for (int i = 0; i < 10000; i++)
{
var b2 = ConvertList1(a2);
}
Console.WriteLine(s2.ElapsedMilliseconds);
var s3 = Stopwatch.StartNew();
var a3 = Enumerable.Repeat(new LinkEntity { A = 10 }, 10000).ToList();
for (int i = 0; i < 10000; i++)
{
var b3 = ConvertList3(a3, f => f);
}
Console.WriteLine(s3.ElapsedMilliseconds);
结果:
的 11609 强>
的 4168 强>
4611