Forum: PC-Programmierung C# Index was outside the bounds of the array.


von Kevin (Gast)


Lesenswert?

Hallo Gemeinde,

könnt ihr mir kurz auf die Sprünge helfen, warum die Schleife quasi 
endlos läuft, bis sie in den Fehler rennt?

Ich überprüfe doch nach jedem Durchgang, ob das Array Null ist...

1
int indexx = 0;
2
3
do
4
{
5
tmpOutPut.WarrantyEndDate.Add(idata.Entitlements[indexx].EndDate);
6
locSupportDescription += @"[" + idata.Entitlements[indexx].ServiceLevelDescription + @"]";
7
indexx++;
8
} while ((idata.Entitlements[indexx].ServiceLevelDescription != null && idata.Entitlements[indexx].EndDate != null) && (idata.Entitlements[indexx].ServiceLevelDescription.Length != 0));


Gruß,
Kevin

von Peter II (Gast)


Lesenswert?

Kevin schrieb:
> Ich überprüfe doch nach jedem Durchgang, ob das Array Null ist...

du bekommt aber "Index was outside the bounds of the Array" also ist 
wohl indexx zu gross für das Array.

Da hilft es auch nicht zu prüfen, was aus dem Array rauskommt. Du musst 
vorher prüfen ob indexx gültig ist.

von Markus (Gast)


Lesenswert?

Kevin schrieb:
> Ich überprüfe doch nach jedem Durchgang, ob das Array Null ist...

Offensichtlich enthalten alle Array-Elemente immer Daten, die Deine 
While-Bedingung erfüllen.

Grüße
Markus

von Markus (Gast)


Lesenswert?

Deine Schleife wird übrigens MINDESTEND EINMAL durchlaufen, auch wenn 
Dein Array überhaupt keine Daten enthält, die Deiner while-Bedingung 
entsprechen oder wenn das Array 0 Elemente haben sollte.

Grüße
Markus

von Peter II (Gast)


Lesenswert?

warum keine foreach schleife?
1
foreach( ServiceLevelDescription sld in idata.Entitlements ) {
2
   tmpOutPut.WarrantyEndDate.Add(sld.EndDate);
3
   locSupportDescription += @"[" + sld.ServiceLevelDescription + @"]";
4
5
   if ( sld == null || sld.EndDate == null || sld.Length == 0 ) {
6
      break;
7
   }
8
}

von Markus (Gast)


Lesenswert?

Peter II schrieb:
> warum keine foreach schleife?
> foreach( ServiceLevelDescription sld in idata.Entitlements ) {
>    tmpOutPut.WarrantyEndDate.Add(sld.EndDate);
>    locSupportDescription += @"[" + sld.ServiceLevelDescription + @"]";
>
>    if ( sld == null || sld.EndDate == null || sld.Length == 0 ) {
>       break;
>    }
> }
Etwas besser wäre
1
foreach( var entitlement in idata.Entitlements )
2
{
3
    tmpOutPut.WarrantyEndDate.Add(entitlement.EndDate);
4
    locSupportDescription += string.Format("[{0}]", entitlement.ServiceLevelDescription);
5
 
6
    if ( entitlement.ServiceLevelDescription == null || entitlement.EndDate == null || entitlement.Length == 0 )
7
    {
8
       break;
9
    }
10
}

;-)

Grüße
Markus

von Halbbastionenerstürmer (Gast)


Lesenswert?

Alternativ vielleicht in dieser Art; dann steht die Bedingung gleich in 
der ersten Zeile.
1
public void Bla(/* ... */ string formatString = null)
2
{
3
  // ...
4
5
  idata.Entitlements.TakeWhile(e => e.ServiceLevelDescription != null && e.EndDate != null && e.Length != 0)
6
  .ForEach(entitlement =>
7
    {
8
      tmpOutPut.WarrantyEndDate.Add(entitlement.EndDate);
9
      locSupportDescription += String.Format(formatString ?? "[{0}]", entitlement.ServiceLevelDescription);
10
    });
11
  // ...
12
}
13
14
static class MyExtensions
15
{
16
  public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
17
  {
18
    foreach (T item in enumeration) action(item);
19
  }
20
}

BTW: Ich verwende ja selbst ständig CamelCase, aber OutPut? ;D

von Kevin (Gast)


Lesenswert?

Markus schrieb:
> Peter II schrieb:
>> warum keine foreach schleife?
>> foreach( ServiceLevelDescription sld in idata.Entitlements ) {
>>    tmpOutPut.WarrantyEndDate.Add(sld.EndDate);
>>    locSupportDescription += @"[" + sld.ServiceLevelDescription + @"]";
>>
>>    if ( sld == null || sld.EndDate == null || sld.Length == 0 ) {
>>       break;
>>    }
>> }
> Etwas besser wäre
> foreach( var entitlement in idata.Entitlements )
> {
>     tmpOutPut.WarrantyEndDate.Add(entitlement.EndDate);
>     locSupportDescription += string.Format("[{0}]",
> entitlement.ServiceLevelDescription);
>
>     if ( entitlement.ServiceLevelDescription == null ||
> entitlement.EndDate == null || entitlement.Length == 0 )
>     {
>        break;
>     }
> }
> ;-)
>
> Grüße
> Markus

Ich danke euch, ich werde mich wohl für diese Variante entscheiden.

Markus schrieb:
> Deine Schleife wird übrigens MINDESTEND EINMAL durchlaufen, auch
> wenn
> Dein Array überhaupt keine Daten enthält, die Deiner while-Bedingung
> entsprechen oder wenn das Array 0 Elemente haben sollte.
>
> Grüße
> Markus

Ja, das ist aber kein Problem, da das Array mit dem Index 0 auf jeden 
Fall Daten enthält...

Markus schrieb:
> Kevin schrieb:
>> Ich überprüfe doch nach jedem Durchgang, ob das Array Null ist...
>
> Offensichtlich enthalten alle Array-Elemente immer Daten, die Deine
> While-Bedingung erfüllen.
>
> Grüße
> Markus

Eben das ist eigentlich nicht der Fall und trotzdem stoppt die Schleife 
nur, wenn sie in den Fehler läuft.

von Markus (Gast)


Lesenswert?

Kevin schrieb:
> Eben das ist eigentlich nicht der Fall und trotzdem stoppt die Schleife
> nur, wenn sie in den Fehler läuft.

Dann stimmt Deine Loop-Bedingung nicht. Vielleicht solltest Du mal 
Debug-Ausgaben (z.B. mit System.Diagnostics.Debug.Write(), ...) oder 
auch direkt mit dem Debugger prüfen, was da los ist.

Grüße
Markus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.