Array.ConvertAll() . , . -, object[,] → string[,].
, . - :
public TOutput[,] ConvertAll<TInput, TOutput>(TInput[,] input, Func<TInput, TOutput> converter)
{
var length0 = input.GetLength(0);
var length1 = input.GetLength(1);
var result = new TOutput[length0, length1];
for (var i = 0; i < length0; ++i)
for (var j = 0; j < length1; ++j)
result[i, j] = converter(input[i, j]);
return result;
}
:
var input = GetSelectedRange();
var converted = ConvertAll(input, x => x.ToString());
, 0, .
public TOutput[,] ConvertAll<TInput, TOutput>(TInput[,] input, Func<TInput, TOutput> converter)
{
var lengths = new[] { input.GetLength(0), input.GetLength(1) };
var lowers = new[] { input.GetLowerBound(0), input.GetLowerBound(1) };
var uppers = new[] { input.GetUpperBound(0), input.GetUpperBound(1) };
var result = Array.CreateInstance(typeof(TOutput), lengths, lowers) as TOutput[,];
for (int i = lowers[0], il = uppers[0]; i <= il; ++i)
for (int j = lowers[1], jl = uppers[1]; j <= jl; ++j)
result[i, j] = converter(input[i, j]);
return result;
}
, , .
public Array ConvertAll<TInput, TOutput>(Array input, Func<TInput, TOutput> converter)
{
var rank = input.Rank;
var lengths = Enumerable.Range(0, rank).Select(i => input.GetLength(i)).ToArray();
var lowerBounds = Enumerable.Range(0, rank).Select(i => input.GetLowerBound(i)).ToArray();
var upperBounds = Enumerable.Range(0, rank).Select(i => input.GetUpperBound(i));
var output = Array.CreateInstance(typeof(TOutput), lengths, lowerBounds);
ConvertRank(input, converter, output, new int[0], lowerBounds.Zip(upperBounds, Tuple.Create).ToArray());
return output;
}
private void ConvertRank<TInput, TOutput>(Array input, Func<TInput, TOutput> converter, Array output, int[] indices, Tuple<int, int>[] bounds)
{
if (!bounds.Any())
{
var value = input.GetValue(indices);
var convertedValue = converter((TInput)value);
output.SetValue(convertedValue, indices);
}
else
{
var start = bounds[0].Item1;
var end = bounds[0].Item2;
var tail = bounds.Skip(1).ToArray();
for (var i = start; i <= end; i++)
ConvertRank(input, converter, output, indices.Concat(new[] { i }).ToArray(), tail);
}
}
( ).
object[,,] input = GetSome3dObjectArray();
var converted = ConvertAll(input, (object x) => x.ToString()) as string[,,];
, , .
public TOutput[,] ConvertAll<TInput, TOutput>(TInput[,] input, Func<TInput, TOutput> converter) =>
ConvertAll((Array)input, converter) as TOutput[,];
public TOutput[,,] ConvertAll<TInput, TOutput>(TInput[,,] input, Func<TInput, TOutput> converter) =>
ConvertAll((Array)input, converter) as TOutput[,,];