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