我有两个字符串数组
string[] input; //user input could be any size
string[] output; //a copy of user input but, should not be larger than 50
如果输入长度< = 50,则输出是输入的精确副本。
如果输入数组长度> 50然后它只会复制输入中的50个元素
必须来自input
的第一个和最后元素,并选择其余均匀 ;它不只是简单地采用第一个或最后50个元素。
最有效的方法是什么?
UPDATE 说输入[]有98个元素。然后你将获取第一个和最后一个元素,然后将其余的除以2得到50个元素
98-2=96
96/2=48
2+48=50
答案 0 :(得分:2)
类似的东西:
public static T[] CopyEvenly<T>(T[] from, int size)
{
if (from.Length <= size)
{
return (T[]) from.Clone();
}
T[] ret = new T[size];
for (int i=0; i < size; i++)
{
ret[i] = from[(i * (from.Length + size - 1)) / size];
}
return ret;
}
如果你到达乘法溢出int
的阶段,这将失败。
答案 1 :(得分:2)
for (float i = 0, int count = 0; count < 50; i+= arraySize / 50.0f, count++)
{
output[count] = input[(int)i];
}
答案 2 :(得分:0)
我认为你有一个处理int divisions的近似问题,试着将它保持在双精度值直到得到索引:
static T[] CopyEvenly<T>(T[] source, int size)
{
if (size >= source.Length)
// or copy it to a new one if you prefer
return source;
T[] ret = new T[size];
// keep everything in doubles
double factor = (double)(source.Length - 1) / (double)(size - 1);
for (int i = 0; i < ret.Length; i++)
{
// cast to int just now
int inputIndex = (int)((double)i * factor);
ret[i] = source[inputIndex];
}
return ret;
}
我希望我能正确理解你的答案。
答案 3 :(得分:0)
这可能有点偏,但我觉得尝试会很有趣。希望我不要让事情更加混乱。
static T[] CopyEvenly<T>(T[] srcArray, int size)
{
int factor=srcArray.Length/size; //this will be the "step" size
T[] retArray=new T[size];
int counter = 0;
//add element 0 and every [factor]'ith element until 1 less than size
while (counter < size - 1 && counter<srcArray.Length)
{
retArray[counter] = srcArray[counter * factor];
counter++;
}
//add the last element
retArray[size] = srcArray[srcArray.Length - 1];
return retArray;
}