簡體   English   中英

將集合轉換為其他類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM