簡體   English   中英

將Object [,]轉換為String [,]

[英]Converting Object [,] to String[,]

我試圖將object[,]數組(例如其中的一些整數)轉換為string[,]數組。 我寫了這段代碼,但Visual Studio給了我一個錯誤說:

無法將String[]隱式轉換為String[,]

我應該給Array.ConvertAll函數什么參數? 非常感謝。

object[,] input = GetSelectedRange();

string[,] dst = Array.ConvertAll<object[,], string[,]>(
    input, 
    x => x.ToString()
);

如果你的項目是object[][]而不是object[,]那將會容易得多。 但對於object[,] ,為什么不使用傳統方法?

object[,] input = GetSelectedRange();
string[,] output = new string[input.GetLength(0), input.GetLength(1)];
for (int i = 0; i < input.GetLength(0); ++i)
    for (int j = 0; j < input.GetLength(1); ++j)
        output[i, j] = input[i, j]?.ToString(); //give additional ?. to check if your input is null

Olivier的建議:使用C#6語法檢查輸入是否為空?.

或者,如果使用較低版本,請使用三元運算符:

object[,] input = GetSelectedRange();
string[,] output = new string[input.GetLength(0), input.GetLength(1)];
for (int i = 0; i < input.GetLength(0); ++i)
    for (int j = 0; j < input.GetLength(1); ++j)
        output[i, j] = input[i, j] == null ? null input[i, j].ToString();

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[,,];

來自: https//stackoverflow.com/a/5083690/380384

object[,] src = new object[2, 3];

// Initialize src with test strings.
src[0, 0] = "aa";
src[0, 1] = "ab";
src[0, 2] = "ac";
src[1, 0] = "ba";
src[1, 1] = "bb";
src[1, 2] = "bc";

string[,] dst = new string[src.GetLength(0), src.GetLength(1)];
Array.Copy(src, dst, src.Length);

請注意,這不是轉換而是重新轉換。 如果object元素實際上是string元素(例如來自Excel工作表的元素),則它可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM