2012-01-07 67 views
2

我有類像下面LINQ列出<T>給出了一個錯誤

class Person 
{ 
    public string Name{get;set;} 
    public string Surname{get;set;} 
    public int Age{get; set;} 
} 

我有這樣

List<Person> persons = new List<Person>(); 

列表然後有一個方法

public Person SelectPerson(string name) 
{ 
    var q = from p in persons where p.Name==name select p; 
    return (Person)q; 
} 

但它給像這樣的錯誤
無法投射物體類型'WhereListIterator`1 [PrsLst.Person]'鍵入'PrsLst.Person'。
SO是什麼問題,你可以幫我解決它。

回答

6
public Person SelectPerson(string name) 
{ 
    var q = from p in persons where p.Name==name select p; 
    return q.FirstOrDefault(); 
} 
+0

請注意,FirstOrDefault方法只取第一個項目,忽略任何後續項目,所以如果你有重複項目,它會簡單地選擇一個項目,而你不知道有什麼錯誤。另外,該方法的返回類型已經是'Person',所以它不需要任何投射。 – Guffa 2012-01-07 20:11:08

+0

關於演員的好處,它已被刪除。至於FirstOrDefault的使用和檢查重複的必要性,我認爲你超出了問題的範圍。您對SelectPerson功能要求的假設是合理的,但並未由所述問題確認。 – 2012-01-09 00:30:55

3

嘗試,

public Person SelectPerson(string name) 
{ 
    var q=(from p in persons where p.Name==name select p).FirstOrDefault();; 
    return q; 
} 
+0

這會給出錯誤。你正在返回'var'而不是'Person'。 – 2012-01-07 06:43:10

+0

@PankajUpadhyay - 沒有錯,它不會抱怨。 – adatapost 2012-01-07 06:49:23

+1

@PankajUpadhyay:不,它不會。變量的類型恰好是'Person'。沒有「var」類型,編譯器確定要使用的類型。 – Guffa 2012-01-07 06:49:32

2
public Person SelectPerson(string name) 
{ 
    Person q = (from p in persons where p.Name==name 
       select p).FirstOrDefault(); 
    return q; 
} 
3

的問題是,查詢的結果是項目的集合,即使收集恰好只包含一個項目。

使用Single方法將單個項目從集合中取出。它還驗證集合實際上只包含一個項目,如果不包含則拋出異常。

由於已知該集合包含Person項,因此不必將結果轉換爲Person

public Person SelectPerson(string name) { 
    var q = from p in persons where p.Name==name select p; 
    return q.Single(); 
} 

如果結果爲空,Single方法也會拋出異常。如果您想在此情況下返回null,則可以使用SingleOrDefault方法。