gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:42 24 4
gpt4 key购买 nike

我需要在 .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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com