[英]Converting collection to different type
我正在將類型的集合轉換為包裝器類型的集合
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)
這種模式是重復的服務時間,但是我不確定是否可以使用隱式轉換編寫通用幫助程序,例如
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>();
}
嘗試一下,將類型強制轉換為動態類型確實可以解決問題,但是如果傳遞錯誤的類型(沒有約束),則是不安全的。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.