Meinews.de  


Zurück   Meinews.de > Forum > Newsgroups microsoft.public.de.* 1 Forum > Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp
Registrieren FAQ Benutzerliste Kalender Suchen Heutige Beiträge Alle Foren als gelesen markieren

Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp Forum microsoft.public.de.german.entwickler.dotnet.csharp

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 11-03-2009, 10:41 AM
Stefan Borst
 
Beiträge: n/a
Standard generiisches Listen-Casting

Hallo,

ich hoffe, dass ich nicht eine Frage zum x-ten male stelle, aber auf die
schnelle hab ich keine Postings gefunden.
Ich wuerde gerne eine generische Liste casten. Bsp:
List<Klasse1> soll in List<Klasse2> gecastet werden.
Klar kann ich eine Foreach-Schleife benutzen, aber vielleicht gibt es dafuer
eine bessere Lösung?

Danke schon mal und viele Gruesse,

Stefan
Mit Zitat antworten
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Meinews.de
Standard Sponsored Links

  #2  
Alt 11-03-2009, 11:16 AM
Joachim Fuchs
 
Beiträge: n/a
Standard Re: generiisches Listen-Casting

Hallo Stefan,

> Klar kann ich eine Foreach-Schleife benutzen, aber vielleicht gibt es
> dafuer
> eine bessere Lösung?


ja, C# 4.0 :-)

Gruß
Joachim
--

Dr. Joachim Fuchs - Autor - Dozent - Softwarearchitekt
http://www.fuechse-online.de/beruflich/index.html -
http://vbnet.codebooks.de



Mit Zitat antworten
  #3  
Alt 11-03-2009, 02:34 PM
Gerald Aichholzer
 
Beiträge: n/a
Standard Re: generiisches Listen-Casting

Hallo Stefan,

Stefan Borst wrote:
> ich hoffe, dass ich nicht eine Frage zum x-ten male stelle, aber auf die
> schnelle hab ich keine Postings gefunden.
> Ich wuerde gerne eine generische Liste casten. Bsp:
> List<Klasse1> soll in List<Klasse2> gecastet werden.
> Klar kann ich eine Foreach-Schleife benutzen, aber vielleicht gibt es dafuer
> eine bessere Lösung?


schau dir mal die ConvertAll-Methode an (Link für das Framework 2.0):
http://msdn.microsoft.com/de-de/libr...wf(VS.80).aspx

Hab ich grad vor ein paar Minuten verwendet, z.B. zum Umwandeln einer
List<User> nach List<string>:

List<string> users = m_api.UserList.ConvertAll(
new Converter<User, string>(
delegate(User user)
{
return user.UserName;
}
)
)

hth,
Gerald
Mit Zitat antworten
  #4  
Alt 11-03-2009, 02:35 PM
André Pönisch
 
Beiträge: n/a
Standard Re: generiisches Listen-Casting

Hallo Stefan,

> ich hoffe, dass ich nicht eine Frage zum x-ten male stelle, aber auf die
> schnelle hab ich keine Postings gefunden.
> Ich wuerde gerne eine generische Liste casten. Bsp:
> List<Klasse1> soll in List<Klasse2> gecastet werden.
> Klar kann ich eine Foreach-Schleife benutzen, aber vielleicht gibt es dafuer
> eine bessere Lösung?


Es ist zwar nicht viel besser als die Foreach-Schleife, da es im Grunde das
gleiche macht, ist aber zumindest optisch schöner:

List<Klasse1> listeMitKlasse1 = [...];
List<Klasse2> listeMitKlasse2;
listeMitKlasse2 = listeMitKlasse1.ConvertAll(item => (Klasse2)item);

Grüße
André
Mit Zitat antworten
  #5  
Alt 11-03-2009, 03:44 PM
Markus Springweiler
 
Beiträge: n/a
Standard Re: generiisches Listen-Casting

Hallo Joachim,

> ja, C# 4.0 :-)


Nein, etwas bidirektionales wie List<T> kannst du damit auch nicht casten.
Entweder "in" oder "out", aber nicht beides.

Du kannst zwar ein IEnumerable casten:
IEnumerable<Animal> animals = new Elefant[];

Aber wenn du dir dasselbe mit List<T> vorstellst:
var elefants = new List<Elefant>();
List<Animal> animals = elefants;
animals.Add(new Ape());
foreach(var elefant in elefants) [..]

Schöne Elefanten, nich?

--
/\/\arkus.
Mit Zitat antworten
  #6  
Alt 11-03-2009, 04:27 PM
Immo Landwerth
 
Beiträge: n/a
Standard Re: generiisches Listen-Casting

Markus Springweiler wrote:

> Hallo Joachim,
>
> > ja, C# 4.0 :-)

>
> Nein, etwas bidirektionales wie List<T> kannst du damit auch nicht
> casten. Entweder "in" oder "out", aber nicht beides.
>
> Du kannst zwar ein IEnumerable casten:
> IEnumerable<Animal> animals = new Elefant[];
>
> Aber wenn du dir dasselbe mit List<T> vorstellst:
> var elefants = new List<Elefant>();
> List<Animal> animals = elefants;
> animals.Add(new Ape());
> foreach(var elefant in elefants) [..]
>
> Schöne Elefanten, nich?


Du hast zwar Recht, aber in der Praxis könnte man die meisten Methoden,
die derzeit ein List<Something> entgegen nehmen auf ein IE<Something>
ändern. Wenn man z.B. den ReSharper verwendet, nervt er schon geradezu
mit Hinweisen dieser Art.

Allerdings kann man auch schon mit .NET 3.5 eine ganze Menge machen:

List<Apple> appleList = ...
List<Fruit> fruitList = appleList.Cast<Fruit>.ToList();

OK, jetzt hat man zwar eine temporäre Liste erstellt, aber man musste
den Casting Code nicht mehr von Hand schrauben.

In den meisten Fällen habe ich aber kein gutes Bachgefühl, wenn ich
erst einen Up-Cast machen muss, aber die Methode wirklich eine List<T>
haben will (also potentiell Daten zur Liste hinzufügen kann). Das würde
ich mal in der Kategorie "Bad Smell" einsortieren...

--
Immo Landwerth
Mit Zitat antworten
  #7  
Alt 11-03-2009, 08:46 PM
Frank Dzaebel
 
Beiträge: n/a
Standard Re: generisches Listen-Casting

Hallo Stefan,

> ich hoffe, dass ich nicht eine Frage zum x-ten male stelle, aber
> auf die schnelle hab ich keine Postings gefunden.
> Ich wuerde gerne eine generische Liste casten. Bsp:
> List<Klasse1> soll in List<Klasse2> gecastet werden.
> Klar kann ich eine Foreach-Schleife benutzen, aber vielleicht gibt
> es dafuer eine bessere Lösung?


Das wäre (auch ohne C# 4.0) möglich mit impliziter
Typ-Konvertierung. Dazu kann man u.a. seine eigene Listen-Klassen
definieren, die das foreach/ConvertAll in die darunterliegende
Implementierung verschieben. Letztlich im Prinzip das Thema
Ko- und Kontravarianz, das ich hier schon des öfteren beschrieben
habe.

Ein automatisches implizites Casting ginge etwa so:

private void Form1_Load(object sender, EventArgs e)
{
List<Klasse2> listeK2 = new List<Klasse2>(){
new Klasse2(){Prop1=42,Prop2=43},
new Klasse2(){Prop1=44,Prop2=45}};
ListK1 listeK1 = listeK2;
}

class Klasse1
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
}

class Klasse2
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
}

class ListK1 : List<Klasse1>
{
public ListK1() : base() { } // Konstruktoren je nach Notwendigkeit ...
public ListK1(IEnumerable<Klasse1> collection) : base(collection) { }

public static implicit operator ListK1(List<Klasse2> liste)
{
ListK1 k1Liste = new ListK1();
foreach (Klasse2 k2 in liste)
k1Liste.Add(new Klasse1(){
Prop1 = k2.Prop1, Prop2 = k2.Prop2});
return k1Liste;
}
}


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Mit Zitat antworten
 
Antwort


Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen
Es ist dir nicht erlaubt, auf Beiträge zu antworten
Es ist dir nicht erlaubt, Anhänge anzufügen
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten

vB Code ist An
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
Frage zur Casting Christoph Michalski Newsgroup microsoft.public.de.german.entwickler.dotnet.vb 3 05-13-2009 11:52 AM
Casting Werner Mueller Newsgroup de.talk.tagesgeschehen 3 01-11-2009 03:47 PM
Casting von generischen Listen Thomas Kehl Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp 5 11-02-2008 01:58 PM
Casting für den Krieg Holger Marzen Newsgroup de.talk.tagesgeschehen 2 11-26-2007 12:06 AM
Casting für den Krieg Holger Marzen Newsgroup de.soc.politik.misc 1 11-24-2007 04:15 PM


Alle Zeitangaben in WEZ. Es ist jetzt 01:29 PM Uhr.





Powered by: vBulletin Version 3.6.7 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Forum SEO by Zoints