2010-07-01 39 views
6

tôi có phương pháp chữ ký sau đây:Làm cách nào để sử dụng LINQ để trả về số nguyên trong một mảng không khớp với thuộc tính số nguyên của một mảng khác?

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

PrimaryKeyData là một lớp học có ServerID và LocalID số nguyên như tài sản. Sinh viên là một lớp học (trong số các thuộc tính khác) có một số nguyên gọi là StudentID.

Trong tiếng Anh, những gì tôi muốn làm là trả về một mảng các số nguyên đó là trong existingstudents [...]. ServerID nhưng không phải trong linkedStudents [...]. StudentID

Nếu 'existingstudents' và ' linkedStudents 'là cả hai mảng nguyên, tôi sẽ sử dụng truy vấn LINQ như sau:

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

.. sau đó có thể được chuyển đổi thành một mảng int.

Những gì tôi muốn làm là cung cấp cho Chứa IEqualityOperator rằng sẽ xem xét một lớp PrimaryKeyData là tương đương với một class Student nếu PrimaryKeyData.ServerID == Student.StudentID

Vì vậy, tôi nghĩ rằng tôi cần một biểu thức lambda nhưng tôi 'rất bối rối về cách mà nó sẽ được xây dựng.

Tôi nghĩ rằng tôi đang đi đúng hướng nhưng có ai có thể giúp tôi vượt qua rào cản cuối cùng không?

Trả lời

5

Vì vậy, hiểu biết của tôi là bạn muốn để có được tất cả các trường hợp có tài sản PrimaryKeyDataV1 ServerID không tồn tại trong bất kỳ tài sản của linkedStudents students.StudentID tham số?

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

Hoặc nếu bạn chỉ muốn một mảng các ID ...

internal static int[] GetStudentIDsThatAreNotLinked(PrimaryKeyDataV1[] existingStudents, IQueryable<Student> linkedStudents) 
{ 
    return existingStudents.Select(s => s.ServerID) 
     .Except(linkedStudents.Select(link => link.StudentID)) 
     .ToArray(); 
} 
2

Nếu bạn chỉ cần phải trả lại ID, bạn có thể sử dụng một cái gì đó như:

existingStudents.Select(es => es.StudentID) 
       .Except(linkedStudents.Select(ls => ls.ServerID)); 

Bạn có thể viết này ở dạng hiểu truy vấn, nhưng tôi nghĩ đó là chưa rõ ràng:

var result = (from es in existingStudents select es.StudentID); 
      .Except 
      (from ls in linkedStudents select ls.ServerID) 

Nếu bạn cần trả lại kết quả dưới dạng mảng, chỉ cần sử dụng tiện ích mở rộng .ToArray():

existingStudents.Select(es => es.StudentID) 
       .Except(linkedStudents.Select(ls => ls.ServerID)).ToArray(); 

Bạn không cần tạo trình so sánh bình đẳng của riêng mình trong trường hợp bạn chỉ cần trả về sự khác biệt đã đặt trong các ID.

+0

Tôi đánh giá cao các chi tiết thêm về hiểu truy vấn nhưng không may, truy vấn trả về linkedstudents mà không phải là trong existingstudents nhưng tôi cần các sinh viên hiện tại không có mối liên kết với nhau –

+0

@Neil: Tôi xin lỗi ... Tôi sẽ sửa chữa câu trả lời của tôi. – LBushkin

+0

Cảm ơn và đã đánh dấu. Một sự xấu hổ, chúng tôi không thể chấp nhận nhiều câu trả lời vì cả hai đều khá nhiều tiền. –

0
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)); 
    } 

đơn giản lớp học sinh:

public class student 
{ 
    public int id; 
    public string name; 
} 
Các vấn đề liên quan