2012-01-07 70 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方法。