Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Bestimmte Elemente aus IEnumerable auswählen: Enumerable.Single/First/Where
Tholi
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

Bestimmte Elemente aus IEnumerable auswählen: Enumerable.Single/First/Where

beantworten | zitieren | melden

Moinsen,

bin gerade dabei, weiter durch die Einschärnkungen der Ausgabe durch zu steigen.

Folgender Code:

List<string> fruits =
                   new List<string> { "apple", "passionfruit", "banana", "mango", 
                                "orange", "blueberry", "grape", "strawberry" };

      fruits.Add("test");
      IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6).Single();

      foreach (string fruit in query)
      {
        Console.WriteLine(fruit);
      }

Ist nichts besonderes, reicht mir aber erstmal zu verstehen.

ich versuche hier die Methode Single mit anzuwenden. Doch leider gelingt mir das nicht so, wie ich mir das vorstelle. (Das es einen Fehler in der Runtime geben sollte ist klar, da mehr als ein Item übrig bleibt.)

Habe auch schon:

 IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6).Single<string>();

probiert. Fehlermeldung, die bei obigen heraus kommt ist:
Fehler
Eine implizite Konvertierung vom Typ "string" in "System.Collections.Generic.IEnumerable<string>" ist nicht möglich.

Frage die sich mir stellt, wie konvertiere ich ihm das nun richtig?

Im MSDN habe ich da bisher leider nichts gefunden, was mir weiter geholfen hat, bin für jeden Tipp dankbar.

Gruß
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Hallo Tholi

dafür gibt es mehrere Möglichkeiten.
fruits.Where(fruit => fruit.Length < 6).First();
fruits.Single(fruit => fruit.Length < 6);

Achtung. Bei Single darf die Ergebnismenge welche durch die Bedingung (fruit.Lenght <6) zurückgegebenwird nur genau 1 sein. Wenn 0 oder 1 nimm [...].SingleOrDefault()

Gruß
Michael
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Zitat
Frage die sich mir stellt, wie konvertiere ich ihm das nun richtig?
Wie wärs mit garnicht?

Entweder fu willst ein einzelnes Element, dann ist das vom Typ string,
oder du willst ne liste aller Elemente, dann lass einfach das .Single weg und du hast IEnumerable<string> als Ergebnis...
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

Hallo zusammen,

der Vollständigkeit halber: James Michael Hare hat vor kurzem den Blogpost C#/.NET Little Wonders: First() and Single() - Similar Yet Different passend zum Thema verfasst. Darin werden die Unterschiede der beiden Erweiterungsmethoden sehr gut erklärt.

m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
Tholi
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

IEnumerable<string> query = fruits.SingleOrDefault(fruit => fruit.Length < 6);

Hatte ich vorhin auch probiert gehabt und leider auch beim Compilieren folgenden Fehler bekommen:
Fehler
Eine implizite Konvertierung vom Typ "string" in "System.Collections.Generic.IEnumerable<string>" ist nicht möglich.

Hatte leider noch nicht geholfen. :(

@Floste: Prinzip geb ich dir Recht. Versuche die Ausgabe auf ein Element gerade herunter zu schrauben.

@m0rius: Sehe ich das falsch oder ist das ein wenig anders? Meine ich habe hier nen IEnumerable.
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

Hallo Tholi,

überleg mal genau, was du da gemacht hast, dann wird dir auch auffallen, warum das gar nicht funktionieren kann: Du versuchst, alle Früchte, deren "Länge" echt kleiner als 6 ist, in query abzuspeichern. Soweit okay — nur wirst du dafür Where() verwenden müssen, da es sich eben nicht um eine einzelne Frucht handelt.

Genau dafür sind Single() und SingleOrDefault() allerdings gedacht, nämlich zum Zurückgeben des einzigen Elementes einer Collection, das eine bestimmte Bedingung erfüllt (respektive null bei Verwendeung von SingleOrDefault(), wenn die Collection leer ist oder keine Elemente enthält, die die Bedingung erfüllen).

Ich verweise an dieser Stelle nochmal auf den oben genannten Blogpost von James Michael Hare!

m0rius
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Wenn du in der Doku nachgesehen hättest würdest du wissen dass Single auf eine Collection von Strings nur einen String zurückgibt, und weil die Methode Single heißt wird logischerweise eben nur 1 Element zurückgegeben.
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Tholi
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

*Kopf -> Tisch*

@xxMUROyy: Danke für die kleine aber feine Erinnerung.

Ist es denn möglich den Rückgabewert wieder in ein IEnumerable<string> herein zu schreiben? Oder muss ich das dann über .Add() realisieren?

Hatte gehofft gehabt, dass es auf meinem Wege funktionieren könnte.
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Zitat
Ist es denn möglich den Rückgabewert wieder in ein IEnumerable<string> herein zu schreiben? Oder muss ich das dann über .Add() realisieren?

new string[1]{wert}
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Zitat
Ist es denn möglich den Rückgabewert wieder in ein IEnumerable<string> herein zu schreiben?
Nein mit Single/SingleOrDefault nicht, aber wie m0rius sagte mit Where.
Wie es Floste sagte ginge es auch, das könnte man dann mit dem Single kombinieren, und dann bist du dir sicher dass die Collection nur ein Element hat.
Aber warum so kompliziert. Auch wenn Single ein Element zurückgibt kannst du doch dieses einer bestehenden Collection hinzufügen.
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von Floste
new string[1]{wert}
Oder noch kürzer: new [] { wert }

Wenn du nur ein einziges Element, aber dennoch als Auflistung, haben möchtest, kannst du dir mal die Enumerable.Take(TSource)-Methode (System.Linq) angucken.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dN!3L am .
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

Zitat von Tholi
Ist es denn möglich den Rückgabewert wieder in ein IEnumerable<string> herein zu schreiben?
Dann mach doch gleich einfach:

fruits.Where(fruit => fruit.Length < 6).Take(1).ToList();
private Nachricht | Beiträge des Benutzers
Tholi
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

 IEnumerable<string> query = new []{fruits.SingleOrDefault(fruit => fruit.Length == 3)};

Das läuft jetzt auch. :)

Das andere Methoden wie zum Beispiel Where() sinnvoller in manchen Fällen ist, ist klar. Brauchte das für mich zum Verständnis.

Vielen Dank an die zahlreichen Antworten. :)
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Wobei ich dann in diesem Beispiel nicht verstehe warum du nicht Where benutzt. So hast du im schlimmsten Fall eine String Collection mit einem leeren String. Bei anderen Objecten null, was schlimm ist wenn du direkt mit der Collection weiterarbeitest. Warum nicht sofort Where nehmen wenn du indirekt genau dies machst.
Meine Frage noch: Warum nicht Single und dieses Single einer anderen Collection adden:
string s = [...].Single([...]);
myCollection.Add(s);
Wäre sicherlich optisch ansprechender und macht den selben Dienst
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Tholi
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

Könnte passieren. Da das gerade nur so ein kleines Testsnippet war, ist das nicht weiter problematisch. Wollte mir genauer anschauen wie das mit Single() funktioniert ;)
private Nachricht | Beiträge des Benutzers