Laden...

Sortieren mit einer "LINQ-Reflrection" - Mischung

Erstellt von Gepro vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.598 Views
G
Gepro Themenstarter:in
419 Beiträge seit 2007
vor 15 Jahren
Sortieren mit einer "LINQ-Reflrection" - Mischung

hallo,

ich verzweifel hier langsam, ich weiß das ich hier etwas schweres und verrücktes versuche...ich möchte eine methode, die mir meine liste sortiert und ich muss nur den eigenschaftsnamen angeben, klar könnte ich das auch mit NUR der linq schreibweise lösen allerdings möchte ich es auf diesem weg erreichen, da ich in anderen Projekten auch immer wieder andere Klassen und Objekte habe (Später soll das noch erweitert werden, aber es scheitert aktuell hier)..


        public void SortListByProperty(IEnumerable list, string propertyname)
        {
            // Exception Handling
            /*******************************************************************/
            Exception exProperty = new Exception("Falschen Eigenschaftswert angegebenen");

            // Eigenschaften zum Sortieren erhalten
            /*******************************************************************/
            List<Object> listObjects = new List<Object>();

            foreach (var item in list)
            {
                listObjects.Add(item);
            }


            // Klasse erhalten
            Type type = listObjects[0].GetType();

            // Eigenschaft, nach der sortiert wird
            PropertyInfo property = type.GetProperty(propertyname);

            if (property == null) { throw exProperty; } // Fehler verhindern (Eigenschaft nicht gefunden)

            // Sortieren
            /*******************************************************************/

            list = from item in listObjects orderby property ascending select item;
        }


            CListSorter sorter = new CListSorter();
            sorter.SortListByProperty(ListeSpieler, "Nr");

das erste problem war immer wie bekomm ich das IEnumberable in meiner LINQ-Schreibform rein, habe mich jetzt für List<Objects> entschieden,

also Fehlermeldungen gibt es nicht, nur er sortiert mir die Liste nicht, sie bleibt wie vorher

J
32 Beiträge seit 2008
vor 15 Jahren

Ist weder verrückt noch schwer 🙂 probiers mal so:


public static IEnumerable<T> SortListByProperty<T>(IEnumerable<T> list, string propertyname) {

			PropertyInfo Prop = typeof(T).GetProperty(propertyname);
			// sort
			IEnumerable<T> result = from item in list orderby Prop.GetValue(item, null) ascending select item;
			//oder
			//list.OrderBy(TObj => Prop.GetValue(TObj, null));

			return result;
		}

Du hast bei dir die propertyinfo zum sortieren verwendet und nicht den wert der property.

viel spaß

G
Gepro Themenstarter:in
419 Beiträge seit 2007
vor 15 Jahren

boah echt super!!! hammer!!!
danke schön!
also die syntax gefält mir sehr gut!

jetzt habe ich nur noch eine frage: und zwar wie kann ich das
ascending
und descanding ersetzten ?? als variable

mit SortOrder gehts schon mal nicht

4.942 Beiträge seit 2008
vor 15 Jahren

Da 'ascending' und 'descending' Keywords sind, einfach eine if-Abfrage einbauen:


if(sortorder == SortOrder.Ascending)
   result = from item in list orderby Prop.GetValue(item, null) ascending select item;
else
  result = from item in list orderby Prop.GetValue(item, null) descending select item;

G
Gepro Themenstarter:in
419 Beiträge seit 2007
vor 15 Jahren

ja ok, so meinte ich es zwar nicht (und so hab ichs jetzt auch aktuell im programm) aber trotzdem danke 😉

meinte eher ob es eine schnittstelle gibt oder eine enum die ich als variable dafür benutzen kann.