2016-10-19 2 views
-1

Hallo Ich habe eine Liste von Noten, die Namen und ihre Noten der Schüler hat. Ich möchte den besten Schüler finden und seinen Namen ausdrucken und in der Ausgabe zeigen. Hier ist mein Codewie Sie eine Eigenschaft einer Liste finden und drucken C#

double maxgrade = grades.Max(t => t.value); 
Console.WriteLine("the top student is : \n"); 
var topgrade = grades.Where(r => r.value == maxgrade); 
Console.WriteLine(grades.Select(r=>r.studentinfo.name)); 

aber es funktioniert nicht. Mein Listenname enthält Noten mit Eigenschaften von Schülerinfo, Kursinfo, Wert und Einheit der Note. Kann mir jemand helfen?

+3

Wie gesagt funktioniert das nicht? Welche Zeile schlägt fehl? Wie scheitert es? – David

+1

vielleicht ist es 'Console.WriteLine (topgrade.Select (r => r.studentinfo.name));' – Mostafiz

+2

es gibt mir eine Zeile wie "system.linq.enumerable ..." in der Ausgabe –

Antwort

4

Das Problem ist, dass Sie select anstelle von verwenden. Die Select gibt eine Sammlung von Elementen zurück, selbst wenn nur 1 Element mit dem Prädikat übereinstimmt, das es noch eine Sammlung ist. Wenn Sie es drucken, erhalten Sie die ToString() von IEnumerable<T> anstelle von was Sie eigentlich wollen, das ist der Wert im Inneren.

Aber ich denke, man kann erreichen, was Sie in einer besseren Art und Weise tun:

var name = grades.OrderByDescending(t => t.value) 
       .FirstOrDefault()?.studentinfo.name; 

Console.WriteLine(name); 

Wenn einige Schüler mit dem höchsten Grad haben, und Sie wollen, dass alle diejenigen drucken, die den höchsten Grad hat:

var names = grades.GroupBy(item => item.value) 
        .OrderByDescending(group => group.Key) 
        .Select(group => group.Select(item => item.studentInfo.name)) 
        .FirstOrDefault(); 

Console.WriteLine(string.Join(", ", names)); 
+0

Vielen Dank –

+0

@SaraMolavi - Sie sind willkommen :) Ich habe ein Problem mit dem zweiten Teil und reparierte es jetzt :) –

1

Sie haben mit der höchsten Qualität gefiltert, so dass Sie aus der gefilterten Sammlung, die topgrade ist, drucken müssen. So ist die Abfrage ändern

Console.WriteLine(topgrade.Select(r=>r.studentinfo.name).FirstOrDefault()); 
+0

es gibt mir eine Zeile wie "system.linq.enumerable ..." in der Ausgabe –

+0

überprüfen Sie die aktualisierte mit 'FirstOrDefault' – Mostafiz

+0

@SaraMolavi haben Sie meine aktualisierte Antwort überprüft? gibt es die gleiche falsche Antwort – Mostafiz

0

Sie haben FirstOrDefault() Methode verwenden afther die letzte Select() aufrufen. Der Grund ist wegen der Ausgabe der Auswahlmethode, die eine IEnumerable<T> ist. Weitere Informationen finden Sie unter here.

1

Mit Zip:

var firstStudent = grades.Select(x => x.value).Zip(grades.Select(y => y.studentinfo.name), 
(value, name) => new { Name = name, Value = value}).OrderBy(z => z.Value).ToList().First(); 

Console.WriteLine(firstStudent.Value + " " + firstStudent.Name); 
+1

Warum zur Hölle Sie es so tun möchten, wenn Sie könnten es so einfach wie in @GiladGreen tun? :) – Pikoh

+0

@Pikoh Ich mag nur Zip, und ich denke wirklich, dass es hier übereinstimmt, wo Sie sowohl den Namen des Schülers und seine Note gruppieren müssen. Was denkst du, ist es übertrieben oder was? Natürlich: oder was :) – meJustAndrew

+1

Oder was natürlich. Einfach nur Witze machen;) – Pikoh

Verwandte Themen