2011-03-08 13 views
5

मैं सी # में किसी SharePoint वेबपार्ट के लिए कुछ कस्टम कोड कर रहा हूं। विशेष रूप से, मैं एक प्रश्नोत्तरी बना रहा हूं, यहां मेरा मुख्य बिंदु उस सूची को संबोधित करता है जिसमें प्रश्न, उत्तर विकल्प और सही उत्तर है।सबसे कुशल सी # शेयरपॉइंट सूची पुनरावृत्ति

प्रश्नोत्तरी के अंतिम चरण में मुझे सूची में सही उत्तर के विरुद्ध उपयोगकर्ता द्वारा चुने गए उत्तरों की जांच करने की आवश्यकता है। वर्तमान में, मैं यह जांचने के लिए निम्नलिखित कर रहा हूं कि प्रत्येक सही है या नहीं, जो मुझे लगता है कि यह बहुत प्रभावी नहीं है क्योंकि यह प्रत्येक प्रश्न के माध्यम से पुनरावृत्त होता है। क्या कोई तरीका है, विशेष रूप से एसपीएलिस्ट फोरैच लूप के लिए, यह अधिक कुशल होगा?

   // 1. Store questions and answers in class 
        List<submittedAnswers> answeredQuestions = new List<submittedAnswers>(); 

       // 2. From POST pull answered question IDs and answer IDs (which correspond to the question primary key and answer choice number both stored in the list) 
        // INSERT BEAUTFIUL AND EFFICIENT WHILE LOOP HERE 

       // 3. Loop through each question is list, if question was given, test if correct/incorrect 
       using (SPWeb myWeb = mySite.OpenWeb()) 
       { 
        SPList answerList = myWeb.Lists[questionList]; 
        foreach (SPListItem quizEntry in answerList.Items) 
        { 
         int pullAnswerId = int.Parse(quizEntry["Answer"].ToString()); // Pull answer number from list 
         int pullQuestionId = int.Parse(quizEntry["ID"].ToString()); // Pull primary key of question 

         submittedAnswers result = answeredQuestions.Find(delegate(submittedAnswers e) { return e.questionId == int.Parse(quizEntry["ID"].ToString()); }); 
         if (result != null) 
         { 
          if (result.responseId != pullAnswerId) // If the response was different from the answer 
           incorrectAnswers++; 
          else 
           correctAnswers++; 
         } 
        } 
       } 
       // C# quiz grading magic here.... 
+0

यह कोड कहां चल रहा है (ईवेंट रिसीवर? वेबपार्ट?) क्या आप हर प्रश्नोत्तरी ग्रेडिंग से बचने की कोशिश कर रहे हैं? सुनिश्चित नहीं है कि आप ऑप्टिमाइज़ करने का प्रयास क्यों कर रहे हैं ... –

+0

प्रश्नोत्तरी वेब पार्ट में चल रही है, और मेरे पास दो चिंताएं हैं: 1. जब हम प्रश्नोत्तरी जारी करते हैं तो संभवत: इसमें कुछ सौ लोग इसे ले सकते हैं और मैं चाहता हूं बाधाओं को कम करने के लिए। 2. यह पहला एएसपी.नेट प्रोग्रामिंग है जो मैंने कभी किया है और चूंकि मैं मुख्य रूप से PHP, ओओ डिज़ाइन और प्रोग्रामिंग में काम करता हूं, मुझे फेंक देता है। इसके अतिरिक्त, मैंने कुछ ब्लॉग पढ़े हैं जो कहते हैं कि सूची के माध्यम से पुनरावृत्त करने की यह विधि बहुत अक्षम है। –

+0

ठीक है अगर आपकी "प्रश्न" सूची में प्रश्नोत्तरी पर दिखाई देने वाले सभी प्रश्न हैं और आपको प्रत्येक उपयोगकर्ता के उत्तर को सत्यापित करने की आवश्यकता है तो मैं कहूंगा कि एक foreach ठीक है। –

उत्तर

3

उपयोग करने के लिए आप सूची में हर आइटम का उपयोग करने की है, तो एक foreach का उपयोग कर की जरूरत है है पूरी तरह से ठीक है:

SPList answerList = myWeb.Lists[questionList]; 
foreach (SPListItem quizEntry in answerList.Items) 
{ 
    // todo... 
} 

आम तौर पर, अधिकांश लोगों को सूची से वस्तुओं के सबसेट के साथ काम करने की आवश्यकता होती है। इस मामले में, आप सबसे अधिक संभावना सूची से वस्तुओं का एक सबसेट पुनर्प्राप्त करना चाहते हैं और फिर अपनी प्रसंस्करण करते हैं। उदाहरण के लिए, SPQuery और SPList.GetItems (code from the full example here) का उपयोग करके: https://www.nothingbutsharepoint.com/sites/devwiki/SP2007Dev/Pages/Accessing%20list%20items%20using%20the%20object%20model.aspx

SharePoint उपकरणों का एक बहुत कुछ है:

// Build a query. 
SPQuery query = new SPQuery(); 
query.Query = string.Concat(
        "<Where><Eq>", 
         "<FieldRef Name='Status'/>", 
         "<Value Type='CHOICE'>Not Started</Value>", 
        "</Eq></Where>", 
        "<OrderBy>", 
         "<FieldRef Name='DueDate' Ascending='TRUE' />", 
         "<FieldRef Name=’Priority’ Ascending='TRUE' />", 
        "</OrderBy>");      

query.ViewFields = string.Concat(
          "<FieldRef Name='AssignedTo' />", 
          "<FieldRef Name='LinkTitle' />", 
          "<FieldRef Name='DueDate' />", 
          "<FieldRef Name='Priority' />"); 

query.ViewFieldsOnly = true; // Fetch only the data that we need. 

// Get data from a list. 
string listUrl = web.ServerRelativeUrl + "/lists/tasks"; 
SPList list = web.GetList(listUrl); 
SPListItemCollection items = list.GetItems(query); 

FYI करें ... यहाँ एक अच्छा लिंक कुछ अन्य विकल्पों पर जा रहा है। यह हमेशा यह निर्धारित करने लायक है कि नौकरी के लिए कौन सा उपकरण सही है। :)

+0

यदि सूची में 200-300 प्रविष्टियां हैं, तो क्या आपको लगता है कि SPQuery के साथ सूची पूछने के लिए और अधिक कुशल है (20-30 मुझे आवश्यकता है), या केवल प्रत्येक के माध्यम से पुनरावृत्ति का उपयोग करें? मुझे आपकी टिप्पणी पसंद है कि 'शेयरपॉइंट में बहुत सारे टूल हैं'। कुल मिलाकर, मुझे इसका उपयोग करना मुश्किल लगता है, मुख्य रूप से क्योंकि मुझे कोई सभ्य दस्तावेज़ीकरण स्रोत नहीं मिल रहा है। –

+0

आपको निश्चित रूप से SPQuery का उपयोग करना चाहिए। जब आप 'SPList.Items 'पर एक foreach का उपयोग करते हुए पुन: प्रयास करते हैं तो यह डीबी से सूची में सभी आइटम पुनर्प्राप्त करेगा। आप पहले आइटम्स का सबसेट प्राप्त करने के लिए 'SPQuery' का उपयोग करना चाहते हैं और ** ** **' सूची से वापस 'SPListItemCollection आइटम' पर पुनरावृत्ति करने के लिए foreach का उपयोग करें। GetItems (query) '। –

+0

मुझे किस आयात कथन का उपयोग करना है? – SearchForKnowledge

1

यह गूंगा प्रतीत हो सकता है लेकिन चर को स्टोर करने के लिए कक्षा का उपयोग करने के बजाय एक सरल सरणी का उपयोग क्यों नहीं किया जाता है? या डेटाबेस में संग्रहीत उत्तरों में उत्तर सरणी की तुलना करने के लिए एक एसक्यूएल क्वेरी लिखना एक आसान तरीका होगा। आपका समाधान बहुत ओओ जादूगर के लिए रास्ता प्रतीत होता है लेकिन शायद यह सिर्फ मुझे।

भी जवाब Performance of Arrays vs. Lists

ऐसा लगता है कि यह एक सूची से अधिक पुनरावृति करने के लिए एक foreach पाश से पाश के लिए एक का उपयोग करने के लिए तेजी से होगा देखो।

+0

मुझे नहीं लगता कि आपका उत्तर एसपीएलिस्ट (एक शेयरपॉइंट ऑब्जेक्ट) के साथ फ़ोरैच का उपयोग करने पर लागू होता है। साथ ही, एक SPList.Items के साथ लूप के लिए उपयोग करना ठीक है जब तक आप इसे सही तरीके से करते हैं: http://blog.dynatrace.com/2009/01/11/the-wrong-way-to-iterate-through-sharepoint -प्लिस्ट-आइटम/ –

+0

@ किट मेनके, यह एक अच्छा मुद्दा है कि मैं एल्गोरिदम देख रहा था, एपीआई नहीं। –

1

मैं कल्पना करता हूं कि सही ढंग से स्वरूपित क्वेरी के साथ SpList.GetItems का उपयोग करके आपको सही उत्तरों की संख्या मिल जाएगी।

U2U CAML Query Builder उपकरण सही क्वेरी प्राप्त करने में उपयोग किया जा सकता है।

0

शेयरपॉइंट में LINQ का उपयोग क्यों नहीं करें? इसका वास्तव में आसान और यानी

SPLinqDataContext dc = new SPLinqDataContext(SPContext.Current.Web.Url); 

EntityList<QuizItem> Answers = dc.GetList<QuizItem>("Quiz"); 
EntityList<QuestionsItem> Questions = dc.GetList<QuestionsItem>("Questions"); 

int iCorrectAnswers = (from q in Questions 
      from a in Answers 
      where (q.Question == a.Question) && (q.CorrectAnswer == a.Answer) 
      select a).Count(); 

int iWrongAnswers = (from q in Questions 
         from a in Answers 
         where (q.Question == a.Question) && (q.CorrectAnswer != a.Answer) 
         select a).Count(); 

यहाँ

पाश

करने की कोई जरूरत के लिए एक गाइड LINQ in Sharepoint

संबंधित मुद्दे