【问题标题】:Adding items to the list inside foreach loop将项目添加到 foreach 循环内的列表中
【发布时间】:2020-09-07 15:15:50
【问题描述】:
epublic ActionResult ExistingPolicies()
    {
        if (Session["UserId"]==null)
        {
            return RedirectToAction("Login");
        }
        using(PMSDBContext dbo=new PMSDBContext())
        {
            List<Policy> viewpolicy = new List<Policy>();
            var userid = Session["UserId"];
            List<AddPolicy> policy= dbo.AddPolicies.Where(c => c.MobileNumber == 
            (string)userid).ToList();
            foreach(AddPolicy p in policy)
            {
                viewpolicy=dbo.Policies.Where(c => c.PolicyId ==p.PolicyId).ToList(); 
            }
            Session["Count"] = policy.Count;
            return View(viewpolicy);
        }
        
    }

这里的策略列表显然有2项。但是当我遍历foreach时,viewpolicy列表只取最后一项作为它的值。如果使用break,它只取第一项。如何在viewpolicy中存储这两项列表??

问候 苏里亚。

【问题讨论】:

标签: c# asp.net-mvc foreach


【解决方案1】:

您可以遍历策略并将它们加一以使用Add 列出,但我会说通常(但并非总是)更好的选择是在一个查询中从数据库中检索整个列表。在不了解您的实体的情况下,您至少可以执行以下操作:

List<AddPolicy> policy = ...
viewpolicy = dbo.Policies
    .Where(c => policy.Select(p => p.PolicyId).Contains(c.PolicyId))
    .ToList();  

但是,如果您正确设置了实体关系,您应该能够执行以下操作:

var viewpolicy = dbo.AddPolicies
    .Where(c => c.MobileNumber == (string)userid)
    .Select(p => p.Policy) //guessing name here, also can be .SelectMany(p => p.Policy)
    .ToList(); 

【讨论】:

    【解决方案2】:

    当然;而不是添加到列表中,而是在循环的每次通过时将其替换为全新的:

    viewpolicy=dbo.Policies.Where(c => c.PolicyId ==p.PolicyId).ToList()
    

    上面的代码将搜索具有该 ID 的策略的所有策略,将其转换为新列表并分配给 viewpolicy 变量。你永远不会用这种方式将任何东西添加到列表中,你只是一直创建新列表并用最新列表覆盖旧列表

    也许你需要这样的东西:

     viewpolicy.Add(dbo.Policies.Single(c => c.PolicyId ==p.PolicyId));
    

    这有一个列表,通过 ID 号找到一个策略(应该只有一个策略,对吗?这是一个 ID,所以我认为它是唯一的..)并将其添加到列表中

    如果需要,您可以使用 Where 并完全跳过循环:

    viewpolicy=dbo.Policies.Where(c => policy.Any(p => c.PolicyId == p.PolicyId)).ToList();
    

    不要循环执行此操作,它不需要它。它通过要求 LINQ 为您执行循环来工作。它应该转换为 IN 查询并由数据库运行,因此通常比将策略一一拖出(通过 id)性能更高。如果 ORM 不了解如何将其转换为 SQL,您可以通过将 id 提取到 int 集合来简化操作:

    viewpolicy=dbo.Policies.Where(c => policy.Select(p => p.PolicyId).Any(id => c.PolicyId == id)).ToList();
    

    最后一点,我建议你用复数命名你的“事物集合”。你有一个List&lt;Policy&gt; viewpolicy - 这是一个包含多个策略的列表,所以我们真的应该称之为viewPolicies。 AddPolicy 列表也是如此。如果集合/列表/数组的东西以复数形式命名,它会使代码更好地阅读

    【讨论】:

      【解决方案3】:

      类似:

                  viewpolicy.AddRange(dbo.Policies.Where(c => c.PolicyId ==p.PolicyId)); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多