【问题标题】:Why I get an error "Not all paths return a value"? [duplicate]为什么我收到错误“并非所有路径都返回值”? [复制]
【发布时间】:2020-04-16 19:29:11
【问题描述】:

我是 C# 新手,我想写一个扩展方法,我可以在 IList 上执行并通过我的标签过滤它。

我写了这样的方法

        public static IList<string> FilterByTag(this IList<string> input, params string[] tags)
        {
            return input.Where(tmp => {       <--- This line error
                foreach (var tag in tags)
                {
                    if (tmp.Contains(tag))
                    {
                        return true;
                    }

                    return false;
                }
            });
        }

在那一行(上图)中,就在=&gt; 我收到一条消息:“并非所有路径都在 lambda 中返回值...

我做错了什么?

更新

在 Anu Viswan 回复后编辑

public static IList<string> FilterByTag(this IList<string> input, params string[] tags)
            {
                return input.Where(tmp => {
                    bool result = true;

                    foreach (var tag in tags)
                    {
                        if (tmp.Contains(tag))
                        {
                            result = true;
                        }

                        result = false;
                    }

                    return result;
                });
            }

【问题讨论】:

  • 您肯定不是说 return false; 语句位于 foreach 循环中。这将防止它循环。并产生错误信息。给 C# 团队买一支雪茄;)

标签: c#


【解决方案1】:

你可以简单地使用 Linq

input.Where(tmp => tags.Any(tag => tmp.Contains(tag));

【讨论】:

    【解决方案2】:

    问题出在这里

    foreach (var tag in tags)
    

    标签为空时会发生什么。您需要为此添加一个案例,例如,

    return input.Where(tmp => {     
                    foreach (var tag in tags)
                    {
                        if (tmp.Contains(tag))
                        {
                            result = true;
                        }
    
                        result = false;
                    }
                    return result; // Or any value that seem appropriate.
    
               });
    

    请注意,方法的返回类型是List,你可能要使用ToList();

    public static IList<string> FilterByTag(this IList<string> input, params string[] tags)
            {
                return input.Where(tmp => {     
                foreach (var tag in tags)
                {
                    if (tmp.Contains(tag))
                    {
                        result = true;
                    }
    
                    result = false;
                }
                return result; // Or any value that seem appropriate.
    
           }).ToList();
            }
    

    但请注意,您需要在此处重新检查您的业务逻辑。由于不清楚您要如何过滤 OP 中的标签,我将其留给您修复逻辑。

    【讨论】:

    • 编辑了我的问题,你的意思是这个吗?
    • 没错。请检查我的更新答案
    • 第一个(原始)return false 甚至不应该在那里。目前,它确保您只检查第一个标签而不会检查其他标签。
    • 确实如此。将其添加为评论。
    【解决方案3】:

    该错误表明存在通过您的方法的代码路径不会导致返回值。修复该错误意味着将 return 语句放在 foreach 循环之外。人们注意到的第二个问题是 foreach 循环中的 return false 语句,它将提前退出 for 循环并阻止检查第二个和以后的标签。将此语句移到 foreach 循环之外可以解决这两个问题。

    public static IList<string> FilterByTag(this IList<string> input, params string[] tags)
    {
        return input.Where(tmp =>
        {
            foreach (var tag in tags)
            {
                if (tmp.Contains(tag))
                {
                    return true; // tag found.  return true.
                }
            }
    
            return false; // reviewed all tags.  tag was not found.
        }
    
        ).ToList();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2013-07-01
      • 2014-04-16
      相关资源
      最近更新 更多