2015-01-29 3 views
-2

Я пытаюсь проверить, существует ли вопрос в элементе управления, а затем выбрать текст вопроса для добавления в список.Получить объекты из списка в Linq в новый список

У меня есть список из 20 вопросов. На экране видны только 7. Я хочу, чтобы получить объекты из списка, которые соответствуют значениям элементов

public partial class CustomQuestion 
    { 

    public string QuestionID { get; set; } 
    public string Question { get; set; } 
    public string ParentQuestionID { get; set; } 
    public int QuestionOrder { get; set; } 
    public string ShowOn { get; set; } 
    public string Option0 { get; set; } 
    public string Option1 { get; set; } 
    public string SelectedOption; 
    } 

public partial class MultipleChoiceQuestion : UserControl 
{ 
     public string Answer { get; set; } 

     public string Question { get; set; } 
} 


public partial class Form1 
{ 
    private List<CustomQuestion> MyQuestion = new List<CustomQuestion>(); 



    private void FindObjects() 
    { 
    var mylist = MyQuestion. 
     Where(qq => qq.Question == FlowLayouPanel1.Controls.Cast<Control>(). 
       Where(x => x is MultipleChoiceQuestion).Cast<MultipleChoiceQuestion>(). 
        Select(c => c.Question)); 
    } 
} 

Ошибки я получаю:

 Error 1 Operator '==' cannot be applied to operands of type 'string' and 'System.Collections.Generic.IEnumerable<string> 

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

+1

Ну, вы сравниваете 'qq.Question', который является строкой со списком строк, возвращаемых последним' Select (c => c.Question) ', и их нельзя сравнивать. Может быть, вам нужно использовать 'Any' на' Select' результате? –

+3

Вы должны использовать OfType вместо того, чтобы делать серию отливок и стилей. –

+0

@SergeyLitvinov Вы случайно не знаете, куда должен идти Любой? Я думаю, что это ответ, но я не использовал никого до – DidIReallyWriteThat

ответ

4

Вы пытаетесь сравнить один вопрос с набором вопросов. Вам нужно сделать перекресток.

Чтобы избежать повторного построения списка вопросов в ваших контролей в 20 раз, сначала заполнить список с вопросами в ваших управления:

var controlQuestions = FlowLayouPanel1.Controls 
             .OfType<MultipleChoiceQuestion>() 
             .Select(c => c.Question) 
             .ToList(); 

Тогда сделайте пересечение:

var mylist = MyQuestion.Where(q => controlQuestions.Contains(q)); 
1

Вам нужно написать так:

var mylist = MyQuestion. 
    Where(qq => FlowLayouPanel1.Controls.OfType<MultipleChoiceQuestion>(). 
       Select(c => c.Question).Any(c => qq.Question == c)); 

Тогда он будет возвращать все вопросы, которые существуют в обоих MyQuestion и

FlowLayouPanel1.Controls 
    .OfType<MultipleChoiceQuestion>() 
    .Select(c => c.Question) 

Но это может зависит от того, что вы хотите достичь

Проблема с вашим исходным кодом заключалась в том, что вы пытались сравнить один qq.Question, который является string с List<string>, который возвращается правильным выражением. Но я полагаю, вам нужно проверить, содержит ли правильное выражение левую строку, поэтому мой ответ - образец, как это сделать.

+0

PS: Я признаю, что подход @JLRishe лучше, так как в этом случае для каждого вопроса будет задан вопрос вопросов от элементов управления, то есть немного отходов ресурсов. –

Смежные вопросы