【问题标题】:Creating an Object List from another List Object LINQ Lambda从另一个列表对象 LINQ Lambda 创建对象列表
【发布时间】:2023-04-18 07:38:01
【问题描述】:

我正在尝试将某些对象添加到另一个对象。但我在“选项”部分收到错误消息。我只是想将某些东西从一个对象中添加到另一个对象中。

这是我的代码的样子..

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

【问题讨论】:

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


    【解决方案1】:

    希望这不会被误导,但我认为你的做法完全错了。您想要执行 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&lt;Question&gt; 并将其分配给Questions 属性。不要尝试就地添加。除此之外,您从未初始化过Questions 列表,因此即使编译了该代码,您也会得到NullReferenceException。同样,您的代码可能还有其他问题,但我认为您从根本上滥用了ForEach,而Select 实际上是正确的操作。

    【讨论】:

    • 您需要在Select 之后添加ToList,因为OptionsList&lt;Option&gt;
    【解决方案2】:

    这里有两个问题。您正在尝试使用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()
    

    它应该可以工作

    【讨论】: