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