yield return在每次迭代时返回相同的结果

时间:2014-01-08 20:15:00

标签: c# yield-return

问题是生成搜索参数的组合,以用作自动化测试中的测试用例输入。

public class CombinationInput<T> 
{
    public string Name { get; set; }
    public List<T> PossibleValues { get; set; }
    public bool ReadOnly { get; set; }
}

GetCombinations是Combinationsgenerator类中的一个方法:

private IEnumerable<object[]> _GetCombinations(ArrayList inputs)
{
    var returnobjects = new object[inputs.Count];
    var element = inputs[0];
    var type = element.GetType();
    var generictype = type.GenericTypeArguments[0];
    var elementvalues = type.GetProperty("PossibleValues").GetValue(element, null) as IEnumerable;

    foreach (var val in elementvalues)
    {
        returnobjects[0] = val;
        if (inputs.Count > 1)
        {
            var objs = _GetCombinations(inputs.GetRange(1, inputs.Count - 1));
            foreach (var item in objs)
            {
                for (int i = 0; i < item.Length; i++)
                {
                    returnobjects[i + 1] = item[i];
                }
                yield return returnobjects;
            }
        }
        else
        {
            yield return returnobjects;
        }
    }
}

Inside TestMethod:

[TestMethod]
public void GetCombinationTest()
{
    var x = new CombinationInput<Enums.AmountType>();
    var y = new CombinationInput<Enums.AreaMeasureType>();
    var z = new CombinationInput<Enums.DisplayItemType>();

    ArrayList list = new ArrayList();
    list.Add(x);
    list.Add(y);
    list.Add(z);
    var combgen = new CombinationGenerator(list);
    var combs = combgen.GetCombinations();
}

当我运行代码时,Get Combinations总是返回相同的组合,但是当我每次点击yield return语句时我通过代码进行调试时它具有正确的组合。

1 个答案:

答案 0 :(得分:3)

在编辑内容本身时,始终返回相同的对象。你得到的是对数组的引用,它总是相同的引用。您应该在returnobjects循环中移动foreach的声明和创建,而不是重复使用相同的数组。