У меня есть следующая сигнатура метода:
internal static int[] GetStudentIDsThatAreNotLinked(PrimaryKeyDataV1[]
existingStudents, IQueryable<Student> linkedStudents)
PrimaryKeyData является классом, который имеет целые числа ServerID и LocalID как свойства. Студент является классом, который (среди других свойств) имеет целочисленное под названием StudentID.
На английском языке, что я хочу сделать, возвратить массив целых чисел, которые находятся в existingStudents [...].ServerID, но не в linkedStudents [...].StudentID
Если бы 'existingStudents' и 'linkedStudents' были оба целочисленными массивами, то я использовал бы запрос linq как указано ниже:
return from es in existingStudents where
!linkedStudents.Contains<int>(es) select es;
.. который мог затем быть преобразован в массив ints.
То, что я хочу сделать, дают, Содержит IEqualityOperator, который будет полагать, что класс PrimaryKeyData равен Студенческому классу если PrimaryKeyData. ServerID == Студент. StudentID
Таким образом, я думаю, что мне нужно лямбда-выражение, но я очень смущен о том, как это было бы создано.
Я думаю, что иду в правильном направлении, но кто-либо может помочь мне по заключительному препятствию?
Итак, насколько я понимаю, вы хотите получить все экземпляры PrimaryKeyDataV1, чье свойство ServerID не существует ни в одном из свойств student.StudentID параметра connectedStudents?
internal static PrimaryKeyDataV1[] GetStudentsThatAreNotLinked(PrimaryKeyDataV1[] existingStudents, IQueryable<Student> linkedStudents)
{
var results = existingStudents.Select(s => s.ServerID)
.Except(linkedStudents.Select(link => link.StudentID))
.ToArray();
return existingStudents.Where(stud => results.Contains(stud.ServerID));
}
Или, если вам просто нужен массив идентификаторов. ..
internal static int[] GetStudentIDsThatAreNotLinked(PrimaryKeyDataV1[] existingStudents, IQueryable<Student> linkedStudents)
{
return existingStudents.Select(s => s.ServerID)
.Except(linkedStudents.Select(link => link.StudentID))
.ToArray();
}
Если вам нужно вернуть только идентификаторы, вы можете использовать что-то вроде:
existingStudents.Select(es => es.StudentID)
.Except(linkedStudents.Select(ls => ls.ServerID));
Вы можете написать это в форме понимания запроса, но я думаю, что это менее понятно:
var result = (from es in existingStudents select es.StudentID);
.Except
(from ls in linkedStudents select ls.ServerID)
Если вам нужно чтобы вернуть результат в виде массива, просто используйте расширение .ToArray ()
:
existingStudents.Select(es => es.StudentID)
.Except(linkedStudents.Select(ls => ls.ServerID)).ToArray();
Вам не нужно создавать собственный компаратор равенства в том случае, если вам нужно только вернуть установленную разницу в ID.
List<student> ExistingStudents = new List<student>();
List<student> LinkedStudents = new List<student>();
ExistingStudents.Add(new student {id=1, name="joe"});
ExistingStudents.Add(new student { id = 2, name = "beth" });
ExistingStudents.Add(new student { id = 3, name = "sam" });
LinkedStudents.Add(new student { id = 2, name = "beth" });
var students = from stud in ExistingStudents
where !(LinkedStudents.Select(x => x.id).Contains(stud.id))
select stud;
foreach(student s in students)
{
System.Diagnostics.Debug.WriteLine(string.Format("id: {0}, name: {1}", s.id, s.name));
}
простой класс студентов:
public class student
{
public int id;
public string name;
}