Laden...

List<T> in List mit festem Datentypen umwandeln

Erstellt von Chris1009 vor 5 Jahren Letzter Beitrag vor 5 Jahren 894 Views
C
Chris1009 Themenstarter:in
2 Beiträge seit 2019
vor 5 Jahren
List<T> in List mit festem Datentypen umwandeln

Moin Leute,
ich habe seit ein paar Tagen folgendes Problem.

Ich habe mir eine universelle Liste geschrieben:


public class UniversalList<T> : List<T>, IEnumerable
{
}

Diese Klasse ist eine Liste, die man entsprechend sortieren und mit LINQ abfragen kann. Weiterhin habe ich an diese "universelle" Liste entsprechend den Inhalten ExtensionMethoden gehaengt, die es nun den Usern der Liste ermoeglichen typen abhaengig entsprechend die moeglichen Funktionen angeboten zu bekommen.

Nun habe ich das Problem dass ich nun als Beispiel eine Liste habe in der z.B. alle moeglichen Elemente in diesem Fall Fahrzuege stehen:


protected UniversalList<Vehicles> vehicles = new UniversalList<Vehicles>();

Diese Liste hat nun die Erweiterungsmethode:


public static UniversalList<Car> getCars(this UniversalList<Vehicles> list)
{            
  List<Car> elements = getElements(list, "Car");
  UniversalList<Car> targetList = new UniversalList<Car>();
  fillUniversalList(elements, targetList);
  return targetList;
}

und nun MEIN PROBLEM

Die Funktion fillUniversalList bekomme ich einfach nicht hin.
Ich möchte dieser Funktion einmal eine UniversalList uebergeben als Quelle. Diese kann ruhig einen festen Werten habe, dass ich immer sage ok das ist immer eine Liste mit allen Elementen, aber die Rueckgabe, also die Tabelle die gefuellt warden soll muss immer Typensicher sein, Sprich Autos oder Flugzeuge etc. enthalten.

Damit ich auf der Liste die typsicher ist und zurueck kommt ich entsprechend wieder die Erweiterungsmethoden habe etc.

Kann mir da jemand einen Denkanstoss / Hilfe geben?

Brauche Quasi einen

Funktion der ich eine List<Vehicle> uebergebe und wo ich eine zweite Liste uebergebe damit die Funktion den Typen hat List<Car> und mit diese entsprechend gefuellt zurueck gibt.

16.807 Beiträge seit 2008
vor 5 Jahren

List<T> erfüllt bereits all diese Anforderungen zusammen mit Extension Methods.
Du musst einfach die Möglichkeiten nutzen, die .NET heute schon hat.
Im Prinzip ist das funktionale Programmierung in .NET: Besserer C#-Code durch funktionale Programmierung | Rainer Stropek

Du erfindest da das Rad neu - nur ist Deines nicht so rund 😉
Diese "UniversalList" macht aus Architektursicht keinen Sinn.

Was Du mit Tabelle meinst ist unklar; es ist eine Liste - keine Tabelle.

PS: es sollte GetCars heissen nicht getCars - wir sind nicht bei Java 😃
[Artikel] C#: Richtlinien für die Namensvergabe

Und es sind Methoden, keine Funktionen 😉

Edit:
Wenn ich jetzt diesen doch leicht wirren Beitrag mehrmals durchlesen, dann gehts Dir wahrscheinlich eher um das Casting.

Da es hier nicht steht, sprechen wir von class Car : Vehicle ?
Downcasting ist ein Code Smell; ein Designfehler.

Was ist denn Deine tatsächliche Anforderung?
Vermutlich willst Du hier ein Problem technisch lösen, das durch einen Denk- oder Designfehler entstanden ist.

C
Chris1009 Themenstarter:in
2 Beiträge seit 2019
vor 5 Jahren

Ich nutze ja List<T> entsprechend. Ich habe mich vielleicht etwas falsch ausgedrueckt. Ich suche einfach die Möglichkeit den Inhalt meiner List<T> in eine typensichere List<FESTER TYP> zu schreiben. Dabei soll die Liste mit dem festen Typen aber dynamisch sein, sprich ich möchte diese Liste der Funktion übergeben, die diese dann füllt und als List<FESTEN TYP> zurück gibt.

Ich möchte keine neue List bauen 😃

Sonst hast Du auch mit den Methoden, der Liste und mit der Groß und Kleinschreibung Recht! Sorry es ist spat und ich gehe etwas auf dem Zahnfleisch momentan.

Hinweis von Abt vor 5 Jahren

Keine Full Quotes [Hinweis] Wie poste ich richtig?

16.807 Beiträge seit 2008
vor 5 Jahren

Evtl verstehe ich es immer noch nicht...meinst Du sowas? 🤔


    public interface IVehicle { }
    public class Car : IVehicle { }
    public class Truck : IVehicle { }
    public static class Ex
    {
        public static IList<T> Filter<T>(this IEnumerable<IVehicle> verhicles) where T : class, IVehicle
        {
            return verhicles.Where(v => v is T).Cast<T>().ToList();
        }
    }


    class Program
    {

        static void Main(string[] args)
        {
            IList<IVehicle> vehicles = new List<IVehicle>
            {
                new Car(),
                new Car(),
                new Car(),
                new Car(),
                new Truck(),
                new Truck(),
                new Truck()
            };

            var cars = vehicles.Filter<Car>();
            var trucks = vehicles.Filter<Truck>();

            Console.WriteLine("Cars: "+ cars.Count);
            Console.WriteLine("Trucks: " + trucks.Count);
        }
    }

Falls ja: dann baust die die OfType Methode nach.