C# - 无法识别右括号

C# - Closing brackets aren't being recognized

我有一个看起来像这样的控制器方法

    public ActionResult SpecialOrderSummary(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            JobOrder jobOrder = db.JobOrders.Find(id);
            if (jobOrder == null)
            {
                return HttpNotFound();
            }
            ViewBag.JobOrderID = jobOrder.ID;
            ItemInstance ii = db.ItemInstances.Where(x => x.serialNumber == jobOrder.serialNumber).FirstOrDefault();
            Item item = db.Items.Find(ii.ItemID);

            var vm = new ItemViewModel
            {
                ItemId = item.ItemID,
                ItemName = item.Name,
                Parts = new List<ItemPartViewModel>
                {
                  foreach (ItemHasParts ihp in item.IHP) 
                  {
                      Part part = db.Parts.Find(ihp.PartID);
                      new ItemPartViewModel
                      {
                         PartId = part.ID,
                         PartName = part.Name
                      };
                  }
                } //this is closing method
            }; // this is closing controller
            
            return View(vm);
        }

但是部件列表和 vm 的结束 } 没有结束右括号。相反,部件 } 正在关闭方法,而 vm } 正在关闭控制器。

为什么会这样?我的语法有问题吗?

不确定您在这里的目的是什么:

            Parts = new List<ItemPartViewModel>
            {
              foreach

如果这是初始化 Parts 变量,它不能包含 foreach 循环

集合初始值设定项需要包含固定数量的元素。您可以使用变量和表达式,但必须有一定数量的变量和表达式:

var stringList = new List<string>() { "a", "b", "c", "d"+"e", person.Name };

编译器会将其转换为对 Add()

的一堆调用

如果您有一些可变数量的项目,您可以添加、添加范围或进行 LINQ 查询以形成您的列表:

foreach(var person in myPeople)
  stringList.Add(person.Name);

//or
stringList.AddRange(myStringArray);

//or
stringList = people.Select(x => x.Name).ToList();

最后一个没有添加到现有列表;它正在用另一个列表替换整个列表。如果您想添加到现有的,您可以:

stringList.AddRange(people.Select(x => x.Name));

LINQ 查询的结果是一个可枚举的字符串列表

是的,在 Parts 列表初始化中不能有 foreach 循环。

你必须做的:

var vm = new ItemViewModel
{
    ItemId = item.ItemID,
    ItemName = item.Name,
    Parts = new List<ItemPartViewModel>()
};

foreach (ItemHasParts ihp in item.IHP) 
{
    Part part = db.Parts.Find(ihp.PartID);

    vm.Parts.Add(new ItemPartViewModel
    {
        PartId = part.ID,
        PartName = part.Name
    };
}

我很惊讶编译器居然让你编译?