将集合转换为不同类型

时间:2015-05-05 15:52:56

标签: c# .net generics

我正在将类型集合转换为包装类型集合

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>();
    }

1 个答案:

答案 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