2010-07-01 9 views
6

मैं निम्न विधि हस्ताक्षर है:मैं एक सरणी में पूर्णांक वापस करने के लिए linq का उपयोग कैसे कर सकता हूं जो किसी अन्य सरणी की पूर्णांक संपत्ति से मेल नहीं खाता है?

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

PrimaryKeyData एक वर्ग है कि गुण के रूप में ServerID और LocalID पूर्णांक है। छात्र एक वर्ग है (अन्य गुणों के साथ) में छात्र पूर्णांक वाला एक पूर्णांक होता है।

अंग्रेजी में, मुझे क्या करना चाहते हैं पूर्णांकों की एक सरणी जो existingStudents में हैं वापसी है [...]। ServerID लेकिन linkedStudents में नहीं [...]। StudentID

यदि 'existingStudents' और '

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

..which तो ints की एक सरणी के लिए परिवर्तित किया जा सकता है: linkedStudents 'दोनों पूर्णांक सरणियों थे, मैं नीचे के रूप में एक LINQ क्वेरी का प्रयोग करेंगे।

मुझे क्या करना दे रहा है चाहता हूँ एक IEqualityOperator कि एक PrimaryKeyData वर्ग पर विचार एक छात्र वर्ग के बराबर होना होगा अगर PrimaryKeyData.ServerID == Student.StudentID

शामिल तो मुझे लगता है मैं एक लैम्ब्डा अभिव्यक्ति लेकिन मैं की जरूरत है मैं बहुत उलझन में हूं कि इसका निर्माण कैसे किया जाएगा।

मुझे लगता है कि मैं सही दिशा में जा रहा हूं लेकिन क्या कोई मुझे अंतिम बाधा पर मदद कर सकता है?

उत्तर

5

तो, मैं समझता हूँ कि आप PrimaryKeyDataV1 जिसका ServerID संपत्ति के सभी उदाहरणों पाने के लिए linkedStudents की students.StudentID संपत्ति में से किसी में मौजूद नहीं है चाहता हूँ पैरामीटर?

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

आप केवल आईडी वापस जाने के लिए की जरूरत है, तो आप की तरह कुछ का उपयोग कर सकते हैं:

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

मैं क्वेरी समझ पर अतिरिक्त विस्तार की सराहना करते हैं लेकिन दुर्भाग्य से, क्वेरी linkedstudents कि existingstudents में नहीं हैं देता है, लेकिन मैं जरूरत मौजूदा स्टूडेंट जो लिंक्स्टस्टुडेंट्स में नहीं हैं –

+0

@Neil: माफ़ी माफी ... मैं अपना जवाब ठीक कर दूंगा। – LBushkin

+0

धन्यवाद और चिह्नित किया गया। शर्म की बात है कि हम कई उत्तरों को स्वीकार नहीं कर सकते क्योंकि दोनों पैसे पर काफी ज्यादा थे। –

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

सरल छात्र वर्ग:

public class student 
{ 
    public int id; 
    public string name; 
} 
संबंधित मुद्दे