2016-04-15 9 views
0

Ich benutze LINQ für Suchfunktion. Ich muss nach einer Liste von Orten suchen (zeige Schüler aus Tokio, Berlin, New York). Ich habe eine foreach-Anweisung, die durch alle Standorte geht und sie zu einer Liste hinzufügt. Mein Problem ist, dass ich sie nicht außerhalb von foreach ignorieren kann. Wie kann ich var newstudents vor foreach erklären?erreichen Variable außerhalb von foreach

Bellow ist mein Code

public void search(IEnumerable<string> Location) 
{ 
    foreach (var l in Location) 
    { 
     var students = from s in db.Students select s; 
     students = students.Where(s => s.City.Contains(l)); 
     var customers = students.ToList();     
    } 
    int custIndex = 1; 
    Session["TopEventi"] = customers.ToDictionary(x => custIndex++, x => x); 
    ViewBag.TotalNumberCustomers = customers.Count(); 
+0

Deklarieren 'var Kunden = students.ToList();' vor dem 'foreach' –

+0

sorry, aber die Studenten innerhalb von forecah –

+1

dann nicht sind Gebenes! Und all das kann sowieso in einer Codezeile gemacht werden. 'var students = db.Students.Where (x => x.City.Any (x => Location.Contains (x));' –

Antwort

2

Lassen Sie sich ganz aus der Schleife zu befreien.

public void search(IEnumerable<string> Location) 
{ 
     string[] locations = Location.Cast<string>().ToArray(); 
     var customers = db.Students.Where(s => locations.Contains(s.City)).ToList(); 
+0

OP eine Teil Suche verwendet, während Sie suchen den kompletten Standort erweitern sollen. –

+0

@TimSchmel Aus der Frage, die OP gibt den vollständigen Namen der Stadt, so basierte ich meine Antwort darauf. Vielleicht suchen sie genau danach? –

+0

Nicht wirklich, OP benutzt 's.City.Contains (l)', wo 'l' die Location-Zeichenkette ist, und' Student.City' ist auch eine 'Zeichenkette'. Dann ist es ['String.Contains'] (https://msdn.microsoft.com/en-gb/library/dy85x1sa (v = vs.110) .aspx), was eine Teilstringsuche ist, während Ihre' locations.Contains (s .City) 'verwendet [' List.Contains'] (https: // msdn.microsoft.com/en-us/library/bhkz42b3(v=vs.110).aspx), die die komplette Zeichenfolge vergleicht. –

3

Mein Problem ist, dass ich sie nicht alle außerhalb von foreach anzeigen kann. Wie kann ich var newstudents vor foreach als deklarieren?

Warum können Sie das nicht tun? Sie müssen nur die Variable als IEnumerable<ClassName> erklären:

IEnumerable<Student> customers = null; 
foreach (var l in Location) 
{ 
    var students = from s in db.Students 
        where s.City.Contains(l) 
        select s; 

    customers = customers.Concat(students);     
} 
customers = customers.ToList() 

Aber Sie brauchen nicht auf die foreach überhaupt, können Sie es tun mit einer LINQ-Abfrage:

IEnumerable<Student> customers = db.Students 
    .Where(s => Location.Any(l => s.City.Contains(l))); 

Dieser Ansatz für eine sucht Teilzeichenfolge in Student.City, die der Speicherort ist.

+0

Dies würde die Werte der Liste in überschreiben jede Schleife oder –

+1

@ConstantinTreiber:? true, so habe ich geändert jetzt das Beispiel 'Concat' zu verwenden, aber der zweite Ansatz scheint viel besser –

1

Sie könnten die Liste außerhalb der foreach und in Seiten erklären Sie nur etwas tun, wie

yourList.AddRange(students.ToList()); 
+0

+1 für die richtige Antwort, aber wie es scheint OP hat nicht das Verständnis.. für diese Programmierung genug sein, um sein Problem zu lösen, vielleicht haben Sie auf Ihrer Antwort mit Erläuterungen – Mafii

0

können Sie ein Wörterbuch erklären für Ihren neuen Schüler zu bestimmten Ort abbildet, und neue Listen, um es in der Schleife hinzuzufügen.

auch Ihre Verwendung des Wortes newstudents ist ein wenig verwirrend - Sie sind noch lookning hier neue Studenten in Ihrem Code nur ihren Standort zuordnen. Sowieso: considerung neue Studenten von außerhalb der Schleife:

public void search(IEnumerable<string> Location) 
{ 
    Dictionary<Location, List<Students>> newStudents = new Dictionary<Location, List<Students>>(); 
    foreach (var l in Location) 
    { 
     var students = from s in db.Students select s; 
     students = students.Where(s => s.City.Contains(l)); 
     newStudents[l]= students.ToList();     
    } 
    int custIndex = 1; 
    //what is this for? seeing lastly added 
    Session["TopEventi"] = customers.ToDictionary(x => custIndex++, x => x); 
    ViewBag.TotalNumberCustomers = (from lists in newStudents select lists.Count).Sum(); 
+0

Wenn du die Schüler einfach auf die Städte abbilden willst, aus denen sie kommen (das ist, was dein Code tatsächlich macht), ist die beste Antwort @ BarryO'Kane –

Verwandte Themen