【问题标题】:C# - Closing brackets aren't being recognized [duplicate]C# - 无法识别右括号[重复]
【发布时间】:2020-07-07 18:55:55
【问题描述】:

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

    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 没有关闭右括号。相反,Parts } 正在关闭方法,而 vm } 正在关闭控制器。

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

【问题讨论】:

  • foreach inside new List { .... } 在我看来非常可疑。

标签: c# asp.net-mvc list controller viewmodel


【解决方案1】:

是的,您不能在 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
    };
}

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

【讨论】:

    【解决方案2】:

    不知道你打算在这里做什么:

                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 查询的结果是一个可枚举的字符串列表

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2021-02-11
      相关资源
      最近更新 更多