Наиболее эффективная итерация C # SharePoint List - PullRequest
5 голосов
/ 08 марта 2011

Я делаю некоторый пользовательский код для веб-части SharePoint в C #.В частности, я делаю викторину, моя главная мысль здесь касается списка, который содержит вопрос, варианты ответов и правильный ответ.

На последнем этапе викторины мне нужно проверить ответы, выбранныеПользователь против правильного ответа в списке.В настоящее время я делаю следующее, чтобы проверить правильность каждого из них, что, как я полагаю, не очень эффективно, поскольку оно повторяет каждый вопрос.Есть ли метод, специально для цикла foreach SPList, который был бы более эффективным?

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

Ответы [ 4 ]

3 голосов
/ 09 марта 2011

Если вам нужен доступ к каждому элементу в списке, тогда использование foreach вполне нормально:

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

Как правило, большинству людей необходимо работать с подмножеством элементов из списка.В этом случае вы, скорее всего, захотите извлечь подмножество элементов из списка, а затем выполнить обработку.Например, с помощью SPQuery и SPList.GetItems ( код из полного примера здесь ):

// 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 ... Вот хорошая ссылка, идущая по некоторым другим параметрам: https://www.nothingbutsharepoint.com/sites/devwiki/SP2007Dev/Pages/Accessing%20list%20items%20using%20the%20object%20model.aspx

В SharePoint много инструментов.Всегда стоит определить, какой инструмент подходит для работы под рукой.:)

1 голос
/ 09 марта 2011

Я думаю, что использование SpList.GetItems с правильно отформатированным запросом даст вам количество правильных ответов.

Инструмент *1005* *1005* * * * * * может использоваться для получения правильного запроса.

1 голос
/ 08 марта 2011

Это может показаться глупым, но вместо использования класса для хранения переменных, почему бы не использовать простой массив?Или еще более простой способ - написать SQL-запрос для сравнения массива ответов с ответами, хранящимися в базе данных.Кажется, ваше решение - путь к большому количеству ОО-волшебства, но, возможно, это только я.

Также посмотрите на ответ Производительность массивов и списков

Похоже, было бы быстрее использовать цикл for, чем цикл foreach для перебора списка.

0 голосов
/ 09 марта 2011

Почему бы не использовать LINQ в Sharepoint?Это действительно просто и не нужно зацикливаться

, т.е.

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 в Sharepoint

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...