Entwickler-Ecke

Basistechnologien - 2 dimensionales Object Array in String umwandeln


cano199 - Do 16.07.15 21:13
Titel: 2 dimensionales Object Array in String umwandeln
Hi,
ich habe ein Problem mit einem Object Array. Ich möchte diesen auf ein bestimmten Inhalt durchsuchen und die Position an dem dieses Übereinstimmt ausgeben lassen. Ich habe einen zwei dimensionalen Object Array[,] und in der Schleife muss ich diesem mit einem String vergleichen. Hierbei bekomme ich bei der Ausführung des Programmes immer eine Fehlermeldung, dass der Typ nicht übereinstimmt. Dementsprechend muss ich aus dem Object Array [,] einen zwei dimensionalen String Array[,] machen. Dieses habe ich mit der convert.to Methode nicht hin bekommen, da diese nur einen eindimensionalen Array umwandeln kann.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
object[,] myExcelFileValues = (object[,])range.Value2;
string[,] result;

for (int i = 0; i < colCount; i++)
{
  for (int j = 0; j < rowCount; j++)
  {
    result[i, j] = Convert.ToString(myExcelFileValues[i, j]);

    if (result[i, j] == eingabe)
    {
      derindex = i;
      break;
    }
  } 
}

Habt ihr eine Idee wie ich das umwandeln kann???

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Do 16.07.15 21:32

Zitat:
Dieses habe ich mit der convert.to Methode nicht hin bekommen, da diese nur einen eindimensionalen Array umwandeln kann.


Convert.ToString und Arrays haben rein gar nix miteinander zu tun. Du rufst es ja auch einfach nur für jede Zelle des Arrays auf. Das es aus einem Array kommt und wieder in einen Array geschrieben wird und wieviele Dimensionen dieses Array hat ist der Methode der Convert Klasse schnurz egal.

Insofern frage ich mich was du uns damit sagen willst das da was nicht geht. Was geht da nicht? Landet etwas nicht erwartetes im result Array? Oder gar nix? Oder knallt der Code oder kompiliert der Code nicht? Oder, oder, oder ... Du mußt schon genauer sein.

Prinzipiell wenn die konkreten Typen die in den Zellen des myExcelFileValues Array stecken sauber ihre ToString überschrieben haben (Convert.ToString macht nix anderes als die ToString Methode des übergebenen Typen aufzurufen) sollte da was konvertiert werden.

Irgendwie solltest du aber die result Variable initialisiert haben so wie gezeigt sollte das nicht kompilieren da result noch dimensionslos ist.


Th69 - Do 16.07.15 22:01

Hallo und :welcome:

du brauchst gar nicht das result-Array, sondern kannst direkt das object-Array abfragen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
object[,] myExcelFileValues = (object[,])range.Value2;

for (int i = 0; i < colCount; i++)
{
  for (int j = 0; j < rowCount; j++)
  {
    if (myExcelFileValues[i, j].ToString() == eingabe)
    {
      derindex = i;
      break;
    }
  }
}

(bedenke, daß die break-Anweisung so nur die innerste Schleife beendet, d.h. die äußere Schleife dann weiterläuft und evtl. nochmals den eingabe-Wert findet - letztendlich du also den Index des letzten Werts erhältst, falls es mehrere gleiche Werte im Array gibt)

PS: Bitte setze demnächst deinen Code selber in passende C#-Tags, danke.


cano199 - Fr 17.07.15 18:08

Hi,
ich habe das mal ausprobiert wie du es gesagt hast, aber leider habe ich immer noch eine Fehlermeldung (screenshot befindet sich im Anhang).[img]


C# - Fr 17.07.15 18:50

diese Fehlermeldung hat nix mit deinem vorherigen Poblem zu tun. Das liegt daran, dass dein Array result noch nicht initzialisiert ist.
Du musst deinem Array eine feste größe zuweisen damit du es verwenden kannst.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
object[,] myExcelFileValues = (object[,])range.Value2;
string[,] result = new string[colCount, rowCount];

for (int i = 0; i < colCount; i++)
{
  for (int j = 0; j < rowCount; j++)
  {
    result[i, j] = Convert.ToString(myExcelFileValues[i, j]);

    if (result[i, j] == eingabe)
    {
      derindex = i;
      break;
    }
  } 
}


// EDIT streich das ich schreib Müll hier

Ist der Code den du verwendest noch der gleiche wie hier oder hast du inzwischen was geändert?

// EDIT 2

Also der Fehler per se bedeutet einfach, dass entweder deine i oder j Variable größer sind, als die entsprechende Dimension deines Arrays. Stimmen den deine colCount und rowCount Variablen?
Du kannst das überprüfen wenn du beim nächsten Fehler einfach mal

C#-Quelltext
1:
myExcelFileValues.GetLength(0)                    

und

C#-Quelltext
1:
myExcelFileValues.GetLength(1)                    

im Direktfenster des Debuggers schreibst und ENTER drückst.
Das Ergebnis des ersten Befehls sollte dann deinem colCount und das Zweite deinem rowCount entsprechen.


Th69 - Fr 17.07.15 18:59

Hast du vllt. rowCount und colCount vertauscht?
Oder du verwendest gleich myExcelFileValues.GetLength(0) und myExcelFileValues.GetLength(1).

Edit: Sorry, hatte nicht gesehen, daß user profile iconC# seinen Beitrag gerade editiert hatte - aber doppelt hält besser. ;-)


cano199 - Fr 17.07.15 21:58

Hi,
euer Hinweis auf die Länge des Arrays war ausschlaggebend! Der Array beginnt bei [1,1] und wenn ich dann i & j auf 0 setzte.... kommt der Fehler!

DANKE!!!


C# - Sa 18.07.15 12:14

Hmm das finde ich jetzt seltsam. Arrays beginnen eigentlich immer bei 0. Es kann sein das bei der Office API alles bei 1 beginnt aber dann müsstest du maximal eine NullReferenceException bekommen und keine IndexOutOfBoundException. Würde mich interessieren was da los ist.