2011-03-08 3 views
5

C#에서 SharePoint 웹 파트에 대한 사용자 지정 코드를 만들고 있습니다. 특히, 나는 질문을하고, 대답을하고, 답을 정하는 목록을 다루는 여기에서 중요한 요점 인 퀴즈를 만들고있다.가장 효율적인 C# SharePoint 목록 반복

퀴즈의 마지막 단계에서 나는 사용자가 선택한 답변을 목록의 정답과 대조해야합니다. 현재, 각 질문이 반복되는지 확인하기 위해 각각이 정확한지 확인하기 위해 다음을 수행하고 있습니다. 이는 매우 효율적이지 않다고 가정합니다. SPList foreach 루프에 대한 메서드가 더 효율적입니까?

   // 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

이 코드는 어디에 실행됩니까 (이벤트 수신자? webpart?) 매번 각 퀴즈를 채점하지 않으려 고합니까? 왜 당신이 최적화를 시도하는지 확신하지 못합니다. –

+0

퀴즈는 웹 파트에서 실행 중입니다. 두 가지 문제가 있습니다. 1. 퀴즈를 풀면 아마 스파이크가 수백명이 걸릴 수 있습니다. 병목 현상을 최소화합니다. 2. 이것은 내가해온 첫 번째 ASP.NET 프로그래밍이며, 주로 PHP로 작업하기 때문에 OO 디자인과 프로그래밍으로 인해 저를 포기합니다. 또한 목록을 반복하는 방법이 매우 비효율적이라고 말하는 몇 가지 블로그를 읽었습니다. –

+0

"질문"목록에 퀴즈에 나오는 질문이 모두 포함되어 있고 각 사용자의 답변을 확인해야하는 경우 foreach가 정상이라고 말하고 싶습니다. –

답변

3

를 사용하여 완벽하게 확인된다 :

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

참고하시기 바랍니다 ... 다음은 몇 가지 다른 옵션을 통해가는 좋은 링크입니다. 항상 현재 작업에 적합한 도구를 결정하는 것은 가치가 있습니다. :)

+0

목록에 200-300 개의 항목이 포함되어 있다면 SPQuery를 사용하여 목록을 쿼리하는 것이 더 효율적이라고 생각합니까? (20-30 개 필요합니다) 또는 각각을 반복 할 때 foreach를 사용 하시겠습니까? 나는 'SharePoint에는 많은 도구가 있습니다'라는 귀하의 의견을 좋아합니다. 전반적으로 나는 사용하기가 어렵다. 왜냐하면 필자는 적절한 문서 소스를 찾을 수 없기 때문이다. –

+0

그러면 반드시 SPQuery를 사용해야합니다. 당신이'SPList.Items'를 통해 foreach를 사용하여 iterate하면 ​​그것은 db에서리스트의 모든 아이템을 가져올 것입니다. 먼저'SPQuery'를 사용하여 항목의 하위 집합을 얻은 다음 ** foreach를 사용하여'list.GetItems (query) '에서 반환 된'SPListItemCollection items'를 반복합니다. –

+0

어떤 import 문을 사용해야합니까? – SearchForKnowledge

1

이것은 바보처럼 들리 겠지만 변수를 저장하는 대신 단순한 배열을 사용하지 않는 이유는 무엇입니까? 또는 더 쉬운 방법은 SQL 쿼리를 작성하여 응답 배열을 데이터베이스에 저장된 응답과 비교하는 것입니다. 당신의 솔루션은 OO 마법에 가깝지만 어쩌면 저의 것 같습니다.

또한 대답 Performance of Arrays vs. Lists이 목록을 반복하는 foreach 루프보다 루프를 사용하는 것이 더 빠를 것처럼 보이는

봐.

+0

귀하의 답변이 SPList (SharePoint 개체)와 함께 foreach를 사용하는 것에 적용되지 않는다고 생각합니다. 또한 SPList와 함께 for 루프를 사용하면 항목을 올바르게 사용할 수 있습니다. http://blog.dynatrace.com/2009/01/11/the-wrong-way-to-iterate-through-sharepoint -splist-items/ –

+0

@Kit Menke, 알고리즘이 아니라 API를보고있는 것이 좋은 지적입니다. –

1

올바른 형식의 쿼리로 SpList.GetItems을 사용하면 정답 수를 얻을 수 있다고 상상합니다.

U2U CAML Query Builder 도구는 올바른 쿼리를 가져 오는 데 유용 할 수 있습니다.

0

왜 Sharepoint에서 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(); 

즉, 당신이 다음 foreach를 사용하여 목록에있는 모든 항목에 액세스해야하는 경우 가이드가 LINQ in Sharepoint