扩展方法不适用于silverlight windows phone 7

时间:2010-12-31 04:31:50

标签: c# windows-phone-7

我为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"));

我可以知道为什么它在我的应用程序中对我不起作用。

1 个答案:

答案 0 :(得分:3)

这是我的猜测(尽管可能是您没有向我们展示您所有的实际相关代码)。

您在FindAll方法的某处放置了断点。然后你运行这一行: -

IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K"));

但你的破发点没有被击中,对吗?

然而这是正确的。在第一次调用从MoveNext IEnumerable中获取的枚举数的str之前,实际上不会调用您的FindAll方法。因此,如果您在foreach上说str后跟随代码,您应该会看到代码开始发生。

顺便说一下,您的实现看起来有点怀疑,当源为null或为空时,您肯定不希望返回包含单个默认值的可枚举值吗?

事实上,如果你真的想从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>