2016-02-27 160 views
4

我在嘗試將object[,]數組(例如其中的某些整數)轉換爲string[,]數組。我寫了這段代碼,但Visual Studio中給了我一個錯誤說:將對象[,]轉換爲字符串[,]

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

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

object[,] input = GetSelectedRange(); 

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

@keyboardP但OP有'ToString' ... – Ian

+0

Yep嘗試了複製方法,但因爲我的輸入包含字符串而出現錯誤。 –

回答

4

這本來是一個容易得多,如果你的產品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(); 
+0

從C#6.0開始:'output [i,j] = input [i,j] ?. ToString();'使它更安全一些。 (注意''.') –

+0

@ OlivierJacot-Descombes啊,C#6!爲什麼不? ;) – Ian

+1

@ OlivierJacot-Descombes更新以檢查輸入是否爲空 – Ian

3

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

來源: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工作表的內容),它就可以工作。