【问题标题】:Linq Select as for loop condition C# [duplicate]Linq Select作为循环条件C# [重复]
【发布时间】:2019-02-05 12:43:33
【问题描述】:

所以,我有一个名为 itemIds 的整数列表和一个名为 items 的对象列表,我该如何重写:

 List<int> itemIds;
 List<object> items;

 for (itemIds.Select(old => (!items.Any(i => i.itemId == old))))
    {
          ItemService.ItemDeleteById(old);
    }

现在它失败了,它要求“;”在 for 的最后一个括号之后,它无法识别旧变量。我想删除满足该条件的项目。谢谢!

【问题讨论】:

  • for 需要开始条件、结束条件和增量步骤,您缺少 3 个中的 2 个。
  • @RonBeyer 你说得比我好。
  • 以下答案适用于您当前的模式。我的问题是,如果 itemIds 看起来足够独特,可以删除,为什么要将它们存储在 List 而不是 Dictionary
  • @DragandDrop MSDN 已经死了,那是 Microsoft Docs
  • 以及对 Microsoft Docs 的强制引用:for statement。正确的语法是:for (&lt;initializer&gt;; &lt;condition&gt;; &lt;iterator&gt;)

标签: c# linq


【解决方案1】:

您可以使用foreach。也用.Where()代替.Select()

foreach (var itemId in itemIds.Where(old => !items.Any(i => i.itemId == old)))
{
    ItemService.ItemDeleteById(itemId);
}

【讨论】:

    【解决方案2】:

    如果您对 itemIds 进行哈希处理,您可能会有一个性能更高的循环:

    HashSet<int> itemIds;
    List<object> items;
    
    foreach (var item in items.Where(i => itemIds.Contains(i.itemId))
    {
       ItemService.ItemDeleteById(item.itemId);
    }
    

    【讨论】:

      【解决方案3】:

      你可以写成:

      foreach(var x in itemsIds.Where(old => items.Contains(old)){
              ItemService.ItemDeleteById(x);
          }
      

      编辑:被帕里什丈夫超越

      【讨论】:

        【解决方案4】:

        尝试使用foreach 代替for 并且Select 没有收到谓词真/假,请改用Where

        foreach (var item in itemIds.Where(old => !items.Any(i => i.itemId == old)))
            {
                  ItemService.ItemDeleteById(item);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-22
          • 1970-01-01
          • 2015-08-19
          • 2018-10-02
          • 2018-09-22
          • 1970-01-01
          • 2015-02-05
          • 2019-07-18
          相关资源
          最近更新 更多