2016-04-27 8 views
1

Ich habe eine Klasse namens Student, es enthält einen Namen und ein paar Noten, die nicht zu viel für dieses Problem sind. Wie würde ich einen einzelnen Schüler nach seinem Namen aus einem List-Objekt auswählen?Wie bekomme ich ein Objekt aus einer Liste einer benutzerdefinierten Klasse?

+0

Wissen Sie, wie man eine Schleife schreibt? –

+0

Wie für, während etc.? Ja, aber ich bin nicht so vertraut mit der foreach-Schleife. – dvs

+0

Sie haben also eine Liste von Objekten des Typs Student? und Sie möchten eine basierend auf der Namenseigenschaft der Studentenklasse herausziehen? –

Antwort

3
students.FirstOrDefault(s => s.Name == studentName); 
+0

So Studenten ist die Liste, Studentname ist eine Zeichenfolge, aber was ist s? – dvs

+0

bitte google 'Lambda-Ausdruck' und' linq query' –

1
List<Student> listOfStudents = new List<Student>(); 
// ... 
// put some data to listOfStudents 
// ... 

var searchName = "MyName"; 
var singleStudent = listOfStudents.Single(s => s.name == searchName); 
// or SingleOrDefault(s=>s.name == searchName) 
0

StudentList Lassen Sie eine Liste von students (Student-Objekte) sein, dass Sie durch Ihre Codes beibehalten wird. Bedenken Sie, dass Sie den ersten Schüler anhand seines Namens auswählen möchten. dann können Sie die Liste .FirstOrDefault verwenden, die Ihnen das ersten passenden Studenten Objekt gibt, das eine bestimmte Bedingung erfüllt: wenn Sie alle Schüler, die holen müssen Name gleich den Suchtext sein wird, können das Sie Liste .Where()

List<student> StudentList = new List<student>(); 
//TODO: Populate the List here 

string searchName = "luckey"; 

student FirstStudent = StudentList 
    .FirstOrDefault(x => String.Equals(searchName, 
            x.Name, 
            StringComparison.CurrentCultureIgnoreCase)); 

// first student whose name is luckey 
List<student> searchResult = StudentList 
    .Where(x => String.Equals(searchName, 
          x.Name,  
          StringComparison.CurrentCultureIgnoreCase)) 
    .ToList(); 
//sub list of students whose name is luckey 
1
verwenden

Es gibt viele Möglichkeiten, dies zu tun. Einfachste wäre eine Schleife verwenden wie:

List<Student> list = new List<Student>(); 
Student matchedStudent = null; 
string inputStudentName = "SomeName"; 
foreach (var student in list) 
{ 
    if (String.Equals(inputStudentName, student.Name, StringComparison.CurrentCultureIgnoreCase)) 
    { 
     matchedStudent = student; 
     break; 
    } 
} 

if (matchedStudent != null) 
{ 
    //student found 
} 

Sie auch LINQ und FirstOrDefault wie verwenden:

matchedStudent = list.FirstOrDefault(s => String.Equals(inputStudentName, s.Name, StringComparison.CurrentCultureIgnoreCase)); 

Es gibt andere Methoden LINQ ein einzelnes Objekt zu bekommen, wie Single, SingleOrDefault usw.

Wenn Sie eine Sammlung aller Schüler erhalten möchten, die Ihren Kriterien entsprechen, dann können Sie Folgendes tun:

Es wäre besser, mit Schleifen zu beginnen und dann mehr über LINQ zu lesen, Sie wären in der Lage, mit LINQ einen kürzeren und eleganten Code zu schreiben.

+1

Einfachste ist der beste Weg vorwärts für die op in diesem Fall, der oben genannte ist perfekt :) –

1

Wenn Sie LINQ lernen möchten, können Sie hier beginnen: Basic LINQ Query Operations.

var student = students.FirstOrDefault(s => s.Name == searchName); 

Dieser Ausdruck ist ein "Lambda-Ausdruck":

s => s.Name == searchName 

Es ist eine anonyme Funktion. Es wird für jedes Element in der Liste aufgerufen. Um es ein wenig klarer, könnte man

(Student s) => s.Name == searchName 

s schreiben ist der Parameter. Da List<Student> ist, kann der Compiler den Typ des Parameters ableiten.

In regulären C#, würden Sie es so schreiben - aber mit dieser Art von Funktionsdefinition, hat es keine Möglichkeit, auf die lokale Variable searchName zugreifen, so dass Sie etwas ungeschickt machen müssen, um diese Arbeit zu machen. Ein Lambda-Ausdruck kann alle lokalen Variablen "sehen", in denen er definiert ist, was alles vereinfacht.

function bool Predicate(Student s) { 
    return s.Name == searchName; 
} 

FirstOrDefault kann null zurück.

Wenn Sie eine Ausnahme auf einen fehlenden Schüler werfen wollen, oder auf redundanten Schülernamen (beide klingen wie eine schlechte Idee, im speziellen Fall von Studenten), können Sie benötigen genau eine Übereinstimmung:

var student = students.Single(s => s.Name == searchName); 

wenn es könnten auch mehrere sein, und Sie wollen sie alle,

var studentEnumeration = students.Where(s => s.Name == searchName); 

Das wird eine Abfrage zurückgeben, können Sie eine Schleife durch:

foreach (var student in studentEnumeration) { 
    // Rap each student on the knuckles with a ruler 
} 
+0

Ich würde sagen, es könnte schlecht ratsam sein, Single zu verwenden, aus Gründen Es ist sicherlich für zwei Personen gültig, denselben Vor- und Nachnamen zu haben. – user2366842

+0

@ user2366842 Ich stimme zu. –

Verwandte Themen