IEnumerable扩展方法问题

时间:2013-09-18 12:10:05

标签: c# .net extension-methods ienumerable

我有从Internet下载的IEnumerable扩展方法,我正在努力编写一个有效的回顾性测试

扩展方法

public static bool In<T>(this T source, params T[] list) where T : IEnumerable
{
    if (source == null) throw new ArgumentNullException("source");
    return list.Contains(source);
}

测试

[TestMethod]
public void In()
{

    IEnumerable<int> search = new int[] { 0 };
    IEnumerable<int> found = new int[] { 0, 0, 1, 2, 3 };
    IEnumerable<int> notFound = new int[] { 1, 5, 6, 7, 8 };

    Assert.IsTrue(search.In(found));
    Assert.IsFalse(search.In(notFound));
}

结果

所有代码都编译但在两个断言中,当我认为第一个断言search.In(found)应该返回true时,extension方法的结果返回false。

问题

我在调用代码中做错了什么,或者扩展名有问题吗?

3 个答案:

答案 0 :(得分:1)

要进行此测试,应该如下所示:

[TestMethod]
public void In()
{

    IEnumerable<int> search = new int[] { 0 };
    IEnumerable<int> a = new int[] { 0, 0, 1, 2, 3 };
    IEnumerable<int> b = new int[] { 0, 0, 1, 2, 3 };
    IEnumerable<int> c = new int[] { 0};

    Assert.IsTrue(search.In(a,b,c));
    Assert.IsFalse(search.In(a,b));
}

这是因为你在这里搜索整个int数组,而不是它们的项目

在上面的代码中,您正在检查是否在所有传递的参数中都有一个您要搜索的数组

如果你想要检查项目列表的扩展名,试试这个:

public static bool In<T> (this T value, IEnumerable<T> list)
{
     return list.Contains(value);
}

然后你可以这样做:

[TestMethod]
public void In()
{

    IEnumerable<int> search = 0;
    IEnumerable<int> found = new int[] { 0, 0, 1, 2, 3 };
    IEnumerable<int> notFound = new int[] { 1, 5, 6, 7, 8 };

    Assert.IsTrue(search.In(found));
    Assert.IsFalse(search.In(notFound));
}

编辑:

感谢Marcin的评论

答案 1 :(得分:1)

T IEnumerable<int>在此int,而非int[]。将局部变量键入In。现在,您在params参数槽中使用单个IEnumerable<int>调用IEnumerable

再看一下你在那里的扩展是假的。为什么源和搜索项(params参数)都是 public static bool In<T>(this T operand, params T[] values) where T : IEquatable<T> { if (values == null) throw new ArgumentNullException("operand"); return In(operand, ((IEnumerable<T>)values)); } public static bool In<T>(this T operand, IEnumerable<T> values) where T : IEquatable<T> { if (values == null) throw new ArgumentNullException("operand"); return values.Contains(operand); } ?没有意义。这是一个工作版本:

{{1}}

答案 2 :(得分:0)

如果您想查看天气,source中的所有元素都在list

    public static bool In<T>(this IEnumerable<T> source, IEnumerable<T> list)
    {
        if (source == null) throw new ArgumentNullException("source");
        return source.All(e => list.Contains(e));
    }

    IEnumerable<int> search = new int[] { 0 };
    IEnumerable<int> found = new int[] { 0, 0, 1, 2, 3 };
    IEnumerable<int> notFound = new int[] { 1, 5, 6, 7, 8 };

    Console.WriteLine(search.In(found));//True
    Console.WriteLine(search.In(notFound));//False