Как я могу использовать linq для возврата целых чисел в одном массиве, которые не совпадают с целочисленным свойством другого массива?

У меня есть следующая сигнатура метода:

 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

Таким образом, я думаю, что мне нужно лямбда-выражение, но я очень смущен о том, как это было бы создано.

Я думаю, что иду в правильном направлении, но кто-либо может помочь мне по заключительному препятствию?

6
задан Neil Trodden 1 July 2010 в 21:03
поделиться

3 ответа

Итак, насколько я понимаю, вы хотите получить все экземпляры 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();
}
7
ответ дан 10 December 2019 в 02:42
поделиться

Если вам нужно вернуть только идентификаторы, вы можете использовать что-то вроде:

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.

2
ответ дан 10 December 2019 в 02:42
поделиться
    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;
}
0
ответ дан 10 December 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: