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

 
Beiträge zu diesem Thema Autor Datum
 LINQ Expression zum Sortieren von Objekten wirft Exception aus TKipp 06.04.2019 08:37
 RE: LINQ Expression zum Sortieren von Objekten wirft Exception aus dannoe 06.04.2019 09:40
 RE: LINQ Expression zum Sortieren von Objekten wirft Exception aus T-Virus 06.04.2019 09:48
 RE: LINQ Expression zum Sortieren von Objekten wirft Exception aus Th69 06.04.2019 10:09
 RE: LINQ Expression zum Sortieren von Objekten wirft Exception aus TKipp 06.04.2019 14:00
 RE: LINQ Expression zum Sortieren von Objekten wirft Exception aus Th69 07.04.2019 08:58

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: 107
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.641
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.780
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.780
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 ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 01.11.2020 03:03