从另一个列表对象LINQ Lambda创建对象列表

时间:2014-02-25 18:23:10

标签: c# asp.net-mvc linq list lambda

我正在尝试将某些对象添加到另一个对象。但我在选项部分遇到错误。我只是想简单地将一些东西从一个物体中添加到另一个物体中。

这是我的代码看起来像..

var responses = new Responses();
                form.Questions.ForEach(
                    q => responses.Questions.Add(new Models.Question()
                    {
                        QuestionId = Convert.ToInt32(q.Id),
                        Value = q.SingleAnswer,
                        Options = q.Options.ForEach( o => q.Options.Add(
                            new Option // <----FAILING HERE!!!!!!!!!!!!
                            {
                                OptionId = 1,
                                Value = "test"
                            }
                            ))

                    })
                );

错误是

Argument type 'Web.Models.Option' is not assignable to parameter type QuestionOptionViewModel

模型:

public class Responses
    {
        public List<Question> Questions { get; set; } 
    }

    public class Question
    {
        public int QuestionId { get; set; }
        public string Value { get; set; }
        public List<Option> Options { get; set; }
    }

    public class Option
    {
        public int OptionId { get; set; }
        public string Value { get; set; }
    }


public class QuestionOptionViewModel
    {
        public int? Id { get; set; }

        public string Text { get; set; }

        public string QuestionType { get; set; }

        [RequiredIf("QuestionType", "text", ErrorMessage = "Required Field")]
        public string Value { get; set; }

        [RequiredIf("QuestionType", "checkbox", ErrorMessage = "Required Field")]
        public bool IsChecked { get; set; }
    }

public class QuestionViewModel
    {
        public int? Id { get; set; }

        public string QuestionType { get; set; }

        public string SubType { get; set; }

        public string Text { get; set; }

        public int SortOrder { get; set; }

        public bool IsHidden { get; set; }

        [RequiredIf("QuestionType", "singleAnswer", ErrorMessage = "Reqired Field")]
        public string SingleAnswer { get; set; }

        [RequiredIf("QuestionType", "radio", ErrorMessage = "Radio Reqired")]
        public int? SelectedRadio { get; set; }

        [RequiredIf("QuestionType", "select", ErrorMessage = "Selection Reqired")]
        public int? SelectedSelect { get; set; }

        public bool CheckboxError { get; set; }

        public List<QuestionOptionViewModel> Options { get; set; }
    }

2 个答案:

答案 0 :(得分:3)

希望这不是太误导,但我认为你这一切都错了。您想要执行Select并将结果分配给回复中的questions属性。这是一个基本的例子;

var responses = new Responses();
    responses.Questions = form.Questions.Select(
                q => new Models.Question()
                {
                    QuestionId = Convert.ToInt32(q.Id),
                    Value = q.SingleAnswer,
                    Options = q.Options.Select(o =>
                        new Option
                        {
                            OptionId = (int) o.Id,
                            Value = o.Value
                        }).ToList()
                }).ToList();

我很快就编辑了你的代码,所以有一些潜力无法正常工作(没有编译或任何东西)。但基本上您使用Select进行投影,返回List<Question>并将其分配给Questions属性。不要试图添加到位。除此之外,您从未初始化Questions列表,因此即使编译该代码,您也会获得NullReferenceException。同样,您的代码可能存在其他问题,但我认为当ForEach实际上是正确的操作时,您会从根本上误用Select

答案 1 :(得分:1)

这里有两个问题。您正在尝试更改正在使用ForEach进行迭代的集合。第二,你试图分配ForEach的结果。相反,您应该使用SelectToList来创建要分配给Options的列表。如果你改变了

Options = q.Options.ForEach( o => q.Options.Add(
      new Option 
      {
            OptionId = 1,
            Value = "test"
       }
       ))

Options = q.Options.Select( 
      new Option 
      {
            OptionId = 1,
            Value = "test"
       }
       ).ToList()

它应该有用