如何使foreach循环在出现异常时跳过该项目

时间:2019-07-03 09:27:36

标签: c# .net

如何使foreach循环在出现异常时跳过该项目?

foreach (var item in items) 
{
   newItems.Add(new object
   {
      Name = item.name,
      Category= GetCategoryByName(item.name),
      AddedTime= DateTime.Now
   });
}

假设我的商品清单中有1000个物品, 每次创建一个新对象时,我都会调用一个在列表中查找并通过执行操作来检索categoryName的函数。

private string GetCategoryByName (string name) 
{
   return CategoryList.Where( n=> n == name).First();
}

但是碰巧,该名称在“类别”列表中不存在,这将导致没有序列匹配的异常,例如

那我想知道如何跳过该类别列表中不存在的项目?我想做的是记录CategoryList中不存在的Name,然后继续进行下一项。感觉就像索引发生在f.eks项上的异常发生在索引600上一样,它仅在此处停止并退出只有599/600项的foreach循环。什么时候可以继续并以999个项目结束(因为一项引起了异常)。

我该如何解决?我要记录并忽略在类别列表中查找时由于类别名称不存在而导致异常的所有项目。

3 个答案:

答案 0 :(得分:3)

假设newItemsList<object>(),则可以执行以下操作:

newItems.AddRange(
    from item in items
    join category in CategoryList on item.name equals category
    select new
    {
        Name = item.name,
        Category = category,
        AddedTime = DateTime.Now
    });

现在,以防万一CategoryList包含重复项,那么这更符合原始代码:

newItems.AddRange(
    from item in items
    from category in CategoryList.Where(n => n == item.name).Take(1)
    select new
    {
        Name = item.name,
        Category = category,
        AddedTime = DateTime.Now
    });

要获取应记录的项目,请执行以下操作:items.Where(item => !CategoryList.Any(n => n == item.name))

答案 1 :(得分:2)

我建议在添加新项目之前计算category

    foreach (var item in items) {
        string category = CategoryList
          .FirstOrDefault(n => n == item.name);

        if (null == category) // we don't have category
            continue;

        newItems.Add(new object
          {
              Name      = item.name,
              Category  = category,
              AddedTime = DateTime.Now
          });
    }

答案 2 :(得分:1)

像这样吗?

foreach (var item in items) 
{
    string catName = GetCategoryByName(item.name);

    if (catName != null)
    {
        newItems.Add(new object
        {
            Name = item.name,
            Category = catName,
            AddedTime = DateTime.Now
        });
    }
}

并修复

  

GetCategoryByName

收件人:

private string GetCategoryByName(string name) 
{
    return CategoryList.FirstOrDefault(n => n == name);
}