c# - 如何使用收缩、toArray 和 fromArray 方法改进 System.Tuple

标签 c# arrays tuples

我需要在 .Net 中实现一个关于 System.Tuple 类的方法。最好的方法是什么?扩展方法、子类化整个 Tuple 类集或基于 System.Tuple 的源代码创建一个新类?

该方法输入一个 Tuple<T1,T2..Tn>并返回 Tuple<T1..Tm> (m<n)基于掩码(int 或 boolean)。如何替换 switch-case 语句和反射的使用?我怎样才能提高性能?

public static object shrink(this object source, params int[] mask)
{
    PropertyInfo[] prop = source.GetType().GetRuntimeProperties().ToArray<PropertyInfo>();
    object[] tmp = new object[mask.Length];
    int index = 0;
    for (int i = 0; i < mask.Length; i++)
    {
        if (mask[i] != 0)
        {
            tmp[index] = prop[i].GetValue(source, null);
            index++;
        }
    }
    switch (index)
    {
        case 1: return Tuple.Create(tmp[0]);
        case 2: return Tuple.Create(tmp[0], tmp[1]);
            ....
            ....
    }
}

以同样的方式我需要实现一个 Tuple到数组和一个数组到Tuple方法。

2) public static object toArray(this object source)

输入:Tuple<T1..Tn>输出:object[]

3) public static object FromArray(this object source)

输入:object[]输出 Tuple<T1..Tn)

最佳答案

这可能不会提高函数的运行时间,但会避免 switch case。

private object StripTuple(object tuple, int[] mask)
{
    int[] indexes = mask.Select((v, i) => new { val = v, index = i }).Where(o => o.val == 1).Select(i => i.index).ToArray();
    object[] items = new object[indexes.Length];
    Type[] tupleTypes = new Type[indexes.Length];
    var originalTupleType = tuple.GetType();
    var genericArgs = originalTupleType.GetGenericArguments();

    for (var i = 0; i < indexes.Length; i++)
    {
        items[i] = originalTupleType.GetProperty("Item" + (indexes[i] + 1)).GetValue(tuple);
        tupleTypes[i] = genericArgs[indexes[i]];
    }

    Type tupleType = Type.GetType("System.Tuple`" + indexes.Length);
    Type newTupleType = tupleType.MakeGenericType(tupleTypes);
    return Activator.CreateInstance(newTupleType, items);
}

用法:

var t1 = new Tuple<int, int, int, string, double, string, int>(1, 2, 3, "4", 5.7, "6", 7);
var newTuple = StripTuple(t1, new int[7]{0,0,0,1,1,0,1}); // "4",5.7,7

该函数将采用前 m 个参数(m <= 元组的长度)。
如果输入是 Tuple<int,int,string,int>并且 length = 3 那么输出类型将为 Tuple<int,int,string>

关于c# - 如何使用收缩、toArray 和 fromArray 方法改进 System.Tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32681711/

相关文章:

c# - 2D 绘图性能(GDI+ 与 SlimDX)

c# - C#中取消async和await方法

arrays - Angular-数组forEach索引

Javascript:让对象继承数组方法

arrays - 在其类型签名中指定数组的长度

C#限制代码量

c# - 解决 LINQ to Entities 无法识别该方法的方法?

php - 如何比较两个包含用户详细信息的数组作为数组并从一个数组中删除匹配的元素?

Python-将文件导入到多个数组、字典、元组中

c++ - 在运行时基于底层元组类型生成元素