0

假设您想测试或比较两个向量的相等性。

假设你有:

string[] models = {"ModelOne", "ModelTwo", "ModeThree"};

还有一个你不确定里面会有什么,但你相信它会包含与上面的模型所有者相同的元素。

我有这个方法来进行这个验证,我在单元测试中使用它,通过models上面提供的向量。

public bool TemplateForDependenciesTests (string[] v)
{
    var dependency = new Dependencies();
    var result = dependency.GetByReferencedModel(typeof(T).ToString());

    //foreach (var i in result)
    //{
        //if ((v.Any(model => model == i.ReferencingModelName)))
    //return false;
    //}

    return result.Any(x => (v.Any(model => model == x.ReferencingModelName)));
}

结果变量将保存此方法的返回:

public IEnumerable<Dependency> GetByReferencedModel(string referencedModelName)
{
    return this.dependencies
        .Where(d => d.ReferencedModelName == referencedModelName);
}

问题是:我怎样才能使这个 return 语句在TemplateForDependenciesTests()工作中很好地工作,并且我可以窥探它确实在做我期望的事情,因为直到现在我在这里和那里移动了一些石头,但它似乎没有做我想要的?

4

2 回答 2

2

看起来您只是想查看集合中是否result有任何成员。似乎这样可以做到:ReferencingModelNamemodels

return result.Select(x => x.ReferencingModelName).Intersect(v).Any();

现在,如果你想窥探它是否真的在做你期望的事情:

var intersection = result.Select(x => x.ReferencingModelName).Intersect(v).ToList();
// now you can examine the contents of the intersection list
// and you can return the result
return intersection.Any();

你甚至可以更进一步:

var result = dependency.GetByReferencedModel(typeof(T).ToString()).ToList();
var names = result.Select(x => x.ReferencingModelName).ToList();
var intersection = names.Intersect(v).ToList();
return intersection.Any();

这样,您可以检查每个步骤的结果,并且应该能够看到错误存在的位置。

顺序无所谓Intersect。也就是说,如果你有:

var x = new string["a", "b", "c"];
var y = new string["c", "b"];
var z = new string["b", "c"];

然后x.Intersect(y) == y.Intersect(x) == x.Intersect(z) == y.Intersect(z),等等。

于 2013-10-28T18:53:00.127 回答
0

您可以通过使它们成为多行语句来使您的 lambda 更易于调试。例如,您可以在上面放置断点以查看到底发生了什么。

var resultList = result.ToList();
return resultList.Any(x =>
{
    bool outer = v.Any(model =>
    {
        bool inner = model == x.ReferencingModelName;
        return inner;
    });
    return outer;
});

我还会注意到,使用ToLookuporToDictionary和 and之类的东西HashSet<T>,您可以使所有这些查找更快、更直观地编码。

于 2013-10-28T18:30:07.900 回答