Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个LINQ查询会抛出InvalidCastException?_C#_Linq_Generics_Generic List - Fatal编程技术网

C# 为什么这个LINQ查询会抛出InvalidCastException?

C# 为什么这个LINQ查询会抛出InvalidCastException?,c#,linq,generics,generic-list,C#,Linq,Generics,Generic List,我在这一行收到一个无效的例外: List<Student> studentsWithSameSurname = (List<Student>)_studentsList .Where(i => i.LastName == textBoxLastName.Text.Trim()) .GroupBy(j => j.FamilyID); 学生班是: public class Student { public int

我在这一行收到一个无效的例外:

List<Student> studentsWithSameSurname =
    (List<Student>)_studentsList
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID);
学生班是:

public class Student
{
    public int StudentID { get; set; }
    public int FamilyID { get; set; }
    public bool EnrolledInAYttFM { get; set; }
    public DateTime DateEnrolledOrHiatusAYttFM { get; set; }
    public bool GivesBibleReading { get; set; }
    public bool PresentsICRVBS { get; set; }
    public bool IsHouseholder { get; set; }
    public bool IsMale { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddr { get; set; }
    public DateTime WeekOfLastAssignment { get; set; }
    public int RecommendedNextTalkTypeID { get; set; }
    public int NextCounselPoint { get; set; }
}
我想做的事情背后的逻辑是:

如果添加了一名学生,并且他们的姓氏已经存在于通用列表中,则需要确定该姓氏的第二个实例是否与前一个相同的家庭成员。更具体地说,如果添加一个史密斯,并且他们是第一个使用该姓氏的人,那么他们将获得下一个可用的familyID;否则,如果已输入该姓氏,则必须确定他们是否属于已输入的家庭之一,或者他们是否是新家庭的第一名成员:

Student surNameCandidateRecord = _studentsList.SingleOrDefault(s => s.LastName == textBoxLastName.Text);
if (null == surNameCandidateRecord)
{
    student.FamilyID = _studentsList.Max(x => x.FamilyID) + 1;
}
else // at least one family with that surname exists already
{
    student.FamilyID = GetFamilyID();
}
GetFamilyID方法是引发此异常的方法,这里是它的整体:

private int GetFamilyID()
{
    List<KeyValuePair<int, string>> familyIDsAndNames;

    // InvalidCastException on the line below
    List<Student> studentsWithSameSurname = (List<Student>)_studentsList.Where(i => i.LastName == textBoxLastName.Text.Trim()).GroupBy(j => j.FamilyID);
    // </ InvalidCastException on the line above

    familyIDsAndNames = new List<KeyValuePair<int, string>>();
    foreach (Student s in studentsWithSameSurname)
    {
        string fullNameWithFamilyIdPrepended = String.Format("({0}). {1} {2}", s.FamilyID, s.FirstName, s.LastName);
        familyIDsAndNames.Add(new KeyValuePair<int, string>(s.FamilyID, fullNameWithFamilyIdPrepended));
    }
    ChooseFamilyForm cff = new ChooseFamilyForm(familyIDsAndNames);
    cff.ShowDialog();
    return AYttFMConstsAndUtils.familyIDSelected;
}
…我正在尝试添加另一个姓Volando的人,因此将代码路由到GetFamilyID方法

我的LINQ查询可能是错误的,但我不知道是哪种方式

使现代化 根据Tordek的回答,这就是我成功使用的方法:

List<Student> studentsWithSameSurname = (List<Student>)_studentsList
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .OrderBy(j => j.FamilyID)
        .ToList();
我会尽快给迪科一笔赏金;既然达到了10公里,我就要参加卡内基音乐节,并给出所有分数。

在这一行

List<Student> studentsWithSameSurname =
    (List<Student>)_studentsList
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID);
而且不像你想象的那样

    ((List<Student>)_studentsList)
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID);
但是,您的结果不是一个列表,而是一个新类型,因为GroupBy方法创建了一个新的学生类型列表列表。IEnumerable类型的GroupBy表达式os的结果,其中T是分组变量,U是元素的类型;在您的情况下,如果FamilyID是int类型,则它将是IEnumerable。

List<Student> studentsWithSameSurname =
    (List<Student>)_studentsList
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID);
而且不像你想象的那样

    ((List<Student>)_studentsList)
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID);

但是,您的结果不是一个列表,而是一个新类型,因为GroupBy方法创建了一个新的学生类型列表列表。IEnumerable类型的GroupBy表达式os的结果,其中T是分组变量,U是元素的类型;在您的情况下,如果FamilyID的类型为int,则它将是IEnumerable。

因为这不是学生对象列表……您无法将Group By强制转换为原始列表,因为Group By返回每个家庭的学生计数。这里有两列Count和FamilyId。如果你想知道每个家庭的人数,没有理由把这一点强加给学生名单;为什么要尝试按FamilyId对结果进行分组?因为这不是学生对象的列表…无法将group by强制转换为原始列表,因为group by返回每个家庭的学生数。这里有两列Count和FamilyId。如果你想知道每个家庭的人数,没有理由把这一点强加给学生名单;你为什么要按FamilyId对结果进行分组?那里有一个GroupBy电话。。。这是一个分组的集合。必须对名单上的学生做出一些决定。@JeffMercado我在最后加了一个说明。我会尽快给这个奖励,以奖励这个答案。请看我的更新。那里有一个群发电话。。。这是一个分组的集合。必须对名单上的学生做出一些决定。@JeffMercado我在最后加了一个说明。我会尽快给这个奖励,以奖励这个答案。请看我的更新。
    ((List<Student>)_studentsList)
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID);
     studentsList
        .Where(i => i.LastName == textBoxLastName.Text.Trim())
        .GroupBy(j => j.FamilyID)
        .ToList();