按字母顺序获取名字在姓氏之前的学生列表
本文关键字:列表 顺序 获取 | 更新日期: 2023-09-27 18:00:03
所以我有一个拥有FirstName和LastName的学生列表。我如何用LINQ查询以给定的方式过滤它们:它们的名字按字母顺序排在姓氏之前?
我尝试了一些类似的东西
var newStudents =
from s in students
where s.FirstName < s.LastName
select s;
我在这里面临的问题是,字符串不能用那种方式进行比较。
学生们还有一个包含他们成绩的int列表,还有另一个查询。我需要提取所有二年级出现两次的学生
例如,我需要选择成绩为{ 2, 3, 4, 5, 2 }
的学生,但忽略成绩为{ 2, 3, 4, 5, 6 }
的学生。
按字母顺序获取名字在姓氏之前的学生列表
这将筛选出FirstName
在LastName
之前、按FirstName
排序、然后按LastName
排序的学生:
var newStudents = students
.Where(s => String.Compare(s.FirstName, s.LastName, StringComparison.Ordinal) < 0) // Filter students whose FirstName is before LastName
.OrderBy(s => s.FirstName) // Order by FirstName
.ThenBy(s => s.LastName); // If FirstNames are equal, then order by LastName
请注意,我使用的是区分大小写的StringComparison.Ordinal
。您可能需要使用StringComparison.OrdinalIgnoreCase
。
暗界的解决方案:
var newStudents =
from s in students
where s.FirstName.CompareTo(s.LastName) < 0
select s;
如果您使用Linq to Objects,这将起作用。
var filteredStudents =
from student in students
where String.Compare(s.FirstName, s.LastName, StringComparison.Ordinal) < 0
order by student.FirstName, student.LastName
select student;
我不知道它是否也适用于Linq到SQL。
最初有两个问题(我回滚了问题):
1)
如何以给定的方式使用LINQ查询过滤它们:它们的第一个名字按字母顺序排在姓氏之前?
2)
我需要选择一个成绩为
{ 2, 3, 4, 5, 2 }
的学生,但忽略成绩为{ 2, 3, 4, 5, 6 }
的学生。
关于问题1:作为其他成员,我建议使用OrderBy
和ThenBy
方法。至于第二个问题:你必须对数据进行分组,并获得出现两次的2年级计数。参见示例(使用LinqPad):
void Main()
{
List<Student> stu = new List<Student>(){
new Student("A", "B", new List<int>{ 2, 3, 4, 5, 2 }),
new Student("B", "A", new List<int>{ 2, 3, 4, 5, 6 }),
new Student("B", "A", new List<int>{ 2, 3, 4, 5, 4 })
};
var qry = stu
.OrderBy(s=>s.FirstName)
.ThenBy(s=>s.LastName)
.Where(s=>s.Grades.GroupBy(r=>r).Any(g=>g.Count(a=>a==2)>1));
//qry.Dump();
}
// Define other methods and classes here
public class Student
{
public Student(string sFName, string sLName, List<int> grades)
{
FirstName = sFName;
LastName = sLName;
Grades = grades;
}
public string FirstName{get;set;}
public string LastName{get;set;}
public List<int> Grades{get;set;}
}
结果:
FirstName LastName Grades
A B 2
3
4
5
2