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