[C#] Dictionary naar casted array

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Klein technisch probleempje, ik heb de volgende dictionary:
C#:
1
2
Dictionary<string, FileStatus> dic = new Dictionary<string, FileStatus>();
//Dictionary vullen...

Die FileStatus is een class die ik gemaakt heb. Die class laat zich casten naar een string:
C#:
1
2
3
public static explicit operator string(FileStatus source) {
   return source.Filename;
}

Nu wil ik alle FileStatus objecten gecast naar een string in een array hebben, dus dacht ik aan zoiets:
C#:
1
string[] files = (string[]) new ArrayList(dic.Values).ToArray(typeof(string));

Offeh, zoiets:
C#:
1
2
3
string[] files = new List<string>(
   (IEnumerable<string>) (IEnumerable) filenames.Values
   ).ToArray();

Maar die geven allebei helaas een InvalidCastException. Toch gek, want een FileStatus laat zich wel gewoon casten naar een string. Ok, die tweede is misschien een beetje bizar, omdat Dictionary<string, FileStatus>.Values gewoon de IEnumerable<string> interface niet implementeert, dus daarvan verwachtte ik ook niet dat ie zou werken :)

En of ik die cast-operator nou implicit of explicit declareer, maakt ook niets uit. Gaat er dus toch ergens anders iets mis, maar waar? Iemand? :)

[ Voor 19% gewijzigd door _Thanatos_ op 25-02-2006 17:11 ]

日本!🎌


  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

Probeer dit eens:
C#:
1
2
3
4
5
List<string> files = new List<string>();
foreach (FileStatus status in filenames)
{
    files.Add((string)status);
}


Als je de cast operator implicit maakt, kan je in mijn voorbeeld de (string) cast weglaten. Dit zou ik echter niet doen. Implicit casts kan je het beste alleen gebruiken als door de cast geen informatie verloren gaat.

[ Voor 23% gewijzigd door Zr40 op 25-02-2006 17:58 . Reden: Info over implicit casts toegevoegd ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
De Values property van een Dictionary is een ValueCollection class, en een ValueCollection class heeft een member CopyTo die de values naar een een-dimensionale array kopieert.

https://fgheysels.github.io/


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Zr40: jouw suggestie werkt an sich wel, maar ik had eigenlijk gehoopt op een oplossing die in 1 statement past ;)

whoami: helaas... CopyTo verwacht een parameter FileStatus[], dat zal dus dus de minder handige kant van generics zijn.

日本!🎌


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 21:39
Je kan eerst copy'en naar een array van FileStatus en dan met ConvertAll van de Array class het omconverteren naar string[]. Of je dat allemaal in 1 regel wilt uitcode weet ik niet. Persoonlijk vind ik het namelijk minder leesbaar ;)

  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

_Thanatos_ schreef op zondag 26 februari 2006 @ 13:02:
Zr40: jouw suggestie werkt an sich wel, maar ik had eigenlijk gehoopt op een oplossing die in 1 statement past ;)
Maak er anders een method van:
C#:
1
2
3
4
5
6
7
8
9
public TTarget[] Convert<TSource, TTarget>(IEnumerable<TSource> source)
{
    List<TTarget> list = new List<TTarget>();
    foreach(TSource item in source)
    {
        list.Add((TTarget)item);
    }
    return list.ToArray();
}


En met jouw voorbeeld aanroepen als:
C#:
1
2
3
4
Dictionary<string, FileStatus> dic = new Dictionary<string, FileStatus>();
//Dictionary vullen...

string[] files = Convert<FileStatus, string>(dic.Values);


Niet getest, maar het zou moeten werken :)

[ Voor 15% gewijzigd door Zr40 op 26-02-2006 19:49 . Reden: Cast vergeten ]

Pagina: 1