为什么会出现错误“并非所有路径都返回值”?

时间:2019-12-26 15:28:22

标签: c#

我是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;
                }
            });
        }

在上面的那一行中,恰好在=>处,我收到一条消息,“并非所有路径都返回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;
                });
            }

3 个答案:

答案 0 :(得分:4)

您只需使用Linq

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

答案 1 :(得分:3)

问题出在这里

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中的标签,我将其保留以供您修复逻辑。

答案 2 :(得分:1)

该错误表明您的方法中有一条代码路径,不会导致返回值。修复该错误意味着将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();
}