2016-04-27 8 views
1

私はStudentというクラスを持っています。このクラスには名前と、この問題にはあまり関係のないいくつかの等級が含まれています。 Listオブジェクトから彼の名前で1人の生徒を選ぶにはどうすればいいですか?カスタムクラスのリストからオブジェクトを取得するにはどうすればよいですか?

+0

ループを書く方法を知っていますか? –

+0

などのように、など?ええ、私はforeachループに慣れていません。 – dvs

+0

あなたはstudentタイプのオブジェクトのリストを持っていますか?あなたは学生クラスの名前プロパティに基づいて1つを取り出したいのですか? –

答えて

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

生徒はリストですが、studentnameは文字列ですが、何ですか? – dvs

+0

google 'lambda expression'と' 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

あなたのコードによって維持されていることを、StudentListstudents(学生対象)のリストになりましょう。彼/彼女の名前に基づいてFirst studentを選択したいと考えてください。あなたは、あなたに与えられた条件を満たし、最初に一致した学生のオブジェクトを与えるリスト.FirstOrDefaultを使用することができます。あなたはその名を検索テキストと同じになりますすべての学生を取得する必要がある場合は、リスト.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
を使用することができます

それを行う方法はたくさんあります。 SingleSingleOrDefaultなどのように、単一のオブジェクトを取得するには、他のLINQの方法にあります

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

:あなたはまた同じようLINQFirstOrDefaultを使用することができます

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 
} 

:最も簡単なのはのようなループを使用することになります

あなたの基準に合ったすべての生徒のコレクションを入手したい場合は、

var matchedStudentCollection = list.Where(s => String.Equals(inputStudentName, s.Name, StringComparison.CurrentCultureIgnoreCase)); 

ループから始めて、LINQについてもっと読むと、LINQを使用してより短い優雅なコードを書くことができます。

+1

この場合、最も簡単な方法は上記の方法ですが、上記の方法は完璧です:) –

1

LINQの学習を開始したい場合は、ここから始めてください:Basic LINQ Query Operations

s => s.Name == searchName 

それは無名関数です:

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

この式は、 "ラムダ式" です。リスト内の各項目に対して呼び出されます。少し明確にするために、あなたは書くことができる

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

がパラメータです。 studentsList<Student>であるため、コンパイラはパラメータの型を推測できます。

通常のC#では、このように記述しますが、この種の関数定義ではローカル変数searchNameにアクセスする方法がないため、その作業を行うには不器用な作業が必要です。ラムダ式は定義されているすべてのローカル変数を「見る」ことができ、すべてを簡略化します。

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

FirstOrDefaultはnullを返すことがあります。

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

:あなたが不足している学生に例外をスロー、または(学生の特定のケースでは悪いアイデアのように両方の音)冗長生徒の名前にしたい場合は

、あなたは正確に一つの試合を必要とすることができますそこにいくつかのこと、あなたはそれらすべてをしたい、

を通じて、あなたがループをできるクエリを返します
var studentEnumeration = students.Where(s => s.Name == searchName); 

可能性がある場合:

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

私は、単独で使用することをお勧めしますそれは2人が同じ名字を持つことは間違いありません。 – user2366842

+0

@ user2366842私は同意します。 –

関連する問題