myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » LINQ Expression zum Sortieren von Objekten wirft Exception aus
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

LINQ Expression zum Sortieren von Objekten wirft Exception aus

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
TKipp TKipp ist männlich
myCSharp.de-Mitglied

Dabei seit: 31.01.2019
Beiträge: 18
Entwicklungsumgebung: Visual Studio 2015
Herkunft: Berlin


TKipp ist offline

LINQ Expression zum Sortieren von Objekten wirft Exception aus

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Leute,
folgender Code soll eingentlich die von einem Webservice gelieferten Objekte, die über eine Combobox ausgelesen werden, sortieren. Tut es aber nicht. Anstatt dessen bekomme ich die Exception:

Fehlermeldung:
"mindestens ein Objekt muss IComparable implementieren"

Was ist da los? Was läuft falsch? wie geht's richtig?
Hier zunächst der Code der Klasse, welches die Objekte liefert:

C#-Code:
using System;
using System.Collections.Generic;
using System.Text;
using ControlExpert_PostMaster.PostMasterWs;

namespace ControlExpert_PostMaster
{
    /// <summary>
    /// Container class for Receiver from WSDL with overwritten ToString() method.
    /// Note: Not inherited, because then the object is not applicable to the WSDL-object without cast etc.
    /// </summary>
    public class AmsReceiver
    {
        public Receiver Receiver { get; set; }

        public override String ToString()
        {
            if (this.Receiver != null)
            {
                return Receiver.ReceiverName;
            }
            else
            {
                return null;
            }
        }
    }
}

und hier der Code, dessen LINQ statement besagte Exception auswirft:

C#-Code:
        private void setReceivers() {
            this.cmbReceiver.SelectedIndexChanged -= this.cmbReceiver_SelectedIndexChanged;
            //TKipp/27.03.2019/Sort Receiver in alpabetical order
            List<AmsReceiver> receivers=new List<AmsReceiver>();
            if(this.transactionData.Receivers != null) {
                receivers.AddRange(this.transactionData.Receivers);
                receivers = (from item in receivers
                                               orderby item.Receiver descending
                                               select item).ToList();

                this.cmbReceiver.DataSource = receivers;
            } else
                this.cmbReceiver.DataSource = this.transactionData.Receivers;
            //TKipp/27.03.2019/End of sorting

            this.cmbReceiver.SelectedIndex = -1;
            this.cmbReceiver.SelectedIndexChanged += this.cmbReceiver_SelectedIndexChanged;
        }

Die Objekte sind lt.Debugger mittels AddRange in die Liste eingefügt worden, werden allerdings nicht sortiert, da das LINQ statement fehlerhaft ist...

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von TKipp am 06.04.2019 08:51.

06.04.2019 08:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dannoe
myCSharp.de-Mitglied

Dabei seit: 24.11.2015
Beiträge: 78
Entwicklungsumgebung: VS2005-VS2017


dannoe ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Woher soll die Sortiermethode denn wissen, nach welcher Logik du sortieren möchtest?
Du übergibst lediglich das Property Receiver von AmsReceiver und der Typ Receiver hat anscheinend keine IComparable-Schnittstelle, somit gibt es auch keine Sortierlogik.
06.04.2019 09:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.327
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vermutlich wolltest du noch die Property ReceiverName bei der orderby mitgeben :)

C#-Code:
receivers = (from item in receivers orderby item.Receiver.ReceiverName descending select item).ToList();
06.04.2019 09:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.365
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ist Receiver eine Klasse von dir?
Ansonsten kannst du mittels eine der  List.Sort()-Methoden (ohne LINQ) das Sortieren durchführen - am einfachsten selber eine  Comparison<T>-Methode erstellen, welche dann -1, 0 oder 1 zurückliefert:

C#-Code:
int CompareReceivers(Receiver receiver1, Receiver receiver2)
{
  // compare
  return ...;
}

Und noch als Hinweis:
die ToString-Methode kannst du verkürzen zu

C#-Code:
public override string ToString()
{
     return Receiver?.ReceiverName;
}
06.04.2019 10:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
TKipp TKipp ist männlich
myCSharp.de-Mitglied

Dabei seit: 31.01.2019
Beiträge: 18
Entwicklungsumgebung: Visual Studio 2015
Herkunft: Berlin

Themenstarter Thema begonnen von TKipp

TKipp ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Receiver ist eine Klasse des Webservices, der mir die Objekte liefert.
Folgender Code funktioniert, d.h., er sortiert die Objekte in alphabetischer Reihenfolge ohne, wie bisher eine Exception auszuwerfen.

C#-Code:
       private void setReceivers() {
            this.cmbReceiver.SelectedIndexChanged -= this.cmbReceiver_SelectedIndexChanged;
            //TKipp/27.03.2019/Sort Receiver in alpabetical order
            AmsReceiver ams = new AmsReceiver();
            List<AmsReceiver> receivers = new List<AmsReceiver>();
            if(this.transactionData.Receivers != null) {
                receivers.AddRange(this.transactionData.Receivers);
                receivers.Sort((item1, item2) => item1.Receiver.ReceiverName.CompareTo(item2.Receiver.ReceiverName));
                this.cmbReceiver.DataSource = receivers;
            } else
                this.cmbReceiver.DataSource = this.transactionData.Receivers;
            //TKipp/27.03.2019/End of sorting

            this.cmbReceiver.SelectedIndex = -1;
            this.cmbReceiver.SelectedIndexChanged += this.cmbReceiver_SelectedIndexChanged;
        }

Dasselbe kürzer:

C#-Code:
List<AmsReceiver> receivers = (from item in this.transactionData.Receivers
                                                   orderby item.Receiver.ReceiverName ascending
                                                   select item).ToList();

Danke für den Tipp, den Code verkürzen zu können. Allerdings benutze ich ternäre Operatoren nur ungerne.Ist folgender Ausdruck äquivalent zu Deinigem

C#-Code:
return  this.Receiver==null ? null : Receiver.ReceiverName;

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von TKipp am 06.04.2019 14:07.

06.04.2019 14:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.365
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja, dein ToString()-Code ist (semantisch) identisch zu meinem.
Jedoch verwendest gerade du den ternären Operator ? : (denn dieser verwendet ja 3 Teilausdrücke ;-). Dafür wurde ja gerade der ?.-Operator eingeführt, um die Abfrage auf null nicht immer ausschreiben zu müssen (vermeiden sollte man aber Kaskaden von ?.-Abfragen in einem längeren geschachtelten Ausdruck).
07.04.2019 08:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 6 Monate.
Der letzte Beitrag ist älter als 6 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.10.2019 13:53