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

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

 internal static int[] GetStudentIDsThatAreNotLinked(PrimaryKeyDataV1[]
       existingStudents, IQueryable<Student> linkedStudents)

PrimaryKeyData - это класс, в котором целыми числами являются ServerID и LocalID. Студент - это класс, который (помимо других свойств) имеет целое число, называемое StudentID.

На английском языке я хочу вернуть массив целых чисел, которые находятся в существующиеStudents [...]. ServerID, но не в relatedStudents [...]. StudentID

Если бы «существующие элементы» и «связанные элементы» были целочисленными массивами, я бы использовал запрос linq, как показано ниже:

return from es in existingStudents where
    !linkedStudents.Contains<int>(es) select es;

.. который затем может быть преобразован в массив целых чисел.

Что я хочу сделать, так это дать Содержит IEqualityOperator, который будет считать класс PrimaryKeyData равным классу Student, если PrimaryKeyData.ServerID == Student.StudentID

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

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

Ответы [ 3 ]

6 голосов
/ 01 июля 2010

Итак, я понимаю, что вы хотите получить все экземпляры 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();
}
2 голосов
/ 01 июля 2010

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

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

Вам не нужно создавать свой собственный компаратор равенства в том случае, если вам нужно только вернуть установленную разницу в идентификаторах.

0 голосов
/ 01 июля 2010
    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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...