2016-04-15 32 views
0

我正在使用linq進行搜索功能。我必須通過一系列地點進行搜索(來自Tokio,柏林,紐約的展示學生)。我有一個foreach語句,它通過所有的位置並將它們添加到列表中。我的問題是,我無法對所有這些事情都置之不理。如何在foreach之前聲明var newstudents?達到foreach之外的變量

貝婁是我的代碼

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

聲明'VAR的客戶= students.ToList();'前'foreach' –

+0

抱歉,但學生們declaired forecah –

+1

裏面然後不!無論如何,所有這些都可以在一行代碼中完成。 'var students = db.Students.Where(x => x.City.Any(x => Location.Contains(x));' –

回答

2

擺脫完全循環。

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是使用子字符串搜索,而你正在尋找完整的位置 –

+0

@TimSchmel ter從OP所傳遞的完整城市名稱的問題來看,所以我根據我的回答得出結論。也許這是他們真正想要的? –

+0

不是,OP正在使用's.City.Contains(l)',其中'l'是位置字符串,'Student.City'也​​是'string'。然後它是['String.Contains'](https://msdn.microsoft.com/en-gb/library/dy85x1sa(v = vs.110).aspx)這是一個子字符串搜索,而您的位置.Contains(s .City)'正在使用['List.Contains'](https:// msdn。microsoft.com/en-us/library/bhkz42b3(v=vs.110).aspx),它比較完整的字符串。 –

3

我的問題是,我不能顯示他們的foreach所有外。如何 我可以在foreach之前聲明var newstudents

爲什麼你不能這樣做?你只需要變量聲明爲IEnumerable<ClassName>

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() 

但你並不需要foreach可言,你可以用一個LINQ查詢做到這一點:

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

這種做法正在搜索在Student.City這是位置的子字符串。

+0

這會覆蓋List中的值每個循環或? –

+1

@ConstantinTreiber:true,所以我現在修改了示例以使用'Concat'。但第二種方法似乎好得多。 –

1

你可以申報清單在foreach之外,在側面你只有這樣做

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

+1爲正確答案,但因爲它似乎OP沒有理解編程這足以解決他的問題,也許你應該擴大你的答案與解釋 – Mafii

0

您可以聲明一個字典,用於將新學生映射到特定位置,並在循環中爲其添加新列表。

此外,您對newstudents這個詞的使用有點令人困惑 - 您也無法在此查看代碼中的新生只映射其位置。不管怎麼說:從外循環considerung新生:

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

如果你想簡單地將學生映射到他們來自的城市(這就是你的代碼實際做的),最好的答案是@ BarryO'Kane –