C# Index was outside the bounds of the array.

Gast #4054636
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
Gast #4054640
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.
Gast #4054648
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
Gast #4054653
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
}
Gast #4054660
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
Gast #4054776
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
Gast #4055255
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.
Gast #4055459
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren