我为IEnumerable编写了一个扩展方法FindAll,以根据谓词条件进行过滤。对于Array和List都是通用的。因为在硅
代码:
public static IEnumerable<T> FindAll<T>(this IEnumerable<T> tCollection, Func<T, bool> predicate)
{
if (null == tCollection) yield return default(T);
using (IEnumerator<T> iterator = tCollection.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield return default(T);
yield break;
}
do
{
if (predicate(iterator.Current))
yield return iterator.Current;
}
while (iterator.MoveNext());
}
}
当我打电话时,它对我不起作用。
List<string> strings = new List<string> { "Kumaran", "Raj", "Kannan", "Karthi", "Gopal" };
IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K"));
我可以知道为什么它在我的应用程序中对我不起作用。
答案 0 :(得分:3)
这是我的猜测(尽管可能是您没有向我们展示您所有的实际相关代码)。
您在FindAll方法的某处放置了断点。然后你运行这一行: -
IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K"));
但你的破发点没有被击中,对吗?
然而这是正确的。在第一次调用从MoveNext
IEnumerable
中获取的枚举数的str
之前,实际上不会调用您的FindAll方法。因此,如果您在foreach
上说str
后跟随代码,您应该会看到代码开始发生。
事实上,如果你真的想从IEnumerable<T>
返回一个过滤集,为什么不使用Linq Where
扩展方法呢?另一方面,如果您尝试在List的完整.NET API中创建FindAll的实现,那么您也应该返回List<T>
。
我怀疑你真正应该做的是将using
添加到你的代码文件中: -
using System.Linq;
然后你可以使用: -
IEnumerable<string> str = strings.Where(item => item.StartsWith("K"));
如果您确实需要返回FindAll
的{{1}}功能,那么: -
List<T>