C# 基于2个枚举的多重置换

C# 基于2个枚举的多重置换,c#,c#-4.0,C#,C# 4.0,我需要根据2个枚举的结果创建测试用例。 例如: public enum Test_ID { // for ram test test1 = 1, test2 , test3 , // for video test test4 , test5 , // many more... } public enum Test_Result { NOT_FAIL = 0, FAIL } public struct Resul

我需要根据2个枚举的结果创建测试用例。 例如:

public enum Test_ID
{
    // for ram test
    test1 = 1,
    test2 ,
    test3 ,
    // for video test
    test4 ,
    test5 ,
    // many more...
}

public enum Test_Result
{
    NOT_FAIL = 0,
    FAIL 
}

public struct ResultStruct
{
    public Test_ID id;
    public Test_Result res;
}
其他一些类结果依赖于这两个枚举

public class foo
{
    public ResultStruct[] ResStructArr =  new ResultStruct[MAX_NUM_OF_TESTS];

    public void updateTestsResults()
    {
        getResult();
        for (int i = 0; i <= MAX_NUM_OF_TESTS; i++)
        {
            if(ResStructArr[i].id == 1 && ResStructArr[i].res == FAIL ||
               ResStructArr[i].id == 2 && ResStructArr[i].res == FAIL ||
               ResStructArr[i].id == 3 && ResStructArr[i].res == FAIL )
               {
                   ramtest.result = FAIL;
               }
               else
               {
                   ramtest.result = NOT_FAIL;
               }

               // Update other tests results here
        }
    }

    public void getResult()
    {
         // get Test_ID and Test_Result and put it in struct array
    }

    // Perform tests..(Ram Test, Video tests, etc)
}
公共类foo
{
public ResultStruct[]ResStructArr=新结果struct[测试的最大数量];
public void updateTestsResults()
{
getResult();

对于(int i=0;i而言,一个简单的嵌套循环语句将生成两组值的每个变化:

var tests = Enum.GetValues(typeof(Test_ID)).Cast<Test_ID>();

var results = Enum.GetValues(typeof(Test_Result)).Cast<Test_Result>();

var pairs = new List<Pair>();

foreach(var test in tests)
{
    foreach(var result in results)
    {
        pairs.Add(new Pair
            {
                Test = test,
                Result = result
            });
    }
}
var tests=Enum.GetValues(typeof(Test_ID)).Cast();
var results=Enum.GetValues(typeof(Test_Result)).Cast();
var pairs=新列表();
foreach(测试中的var测试)
{
foreach(结果中的var结果)
{
配对。添加(新配对)
{
测试=测试,
结果=结果
});
}
}
你的问题不清楚你想用这些信息做什么,所以下面是我的推断和建议


看起来你的
updateRamTest
方法只是检查是否有任何测试失败,然后
ramTest.result
被设置为
false
。那么为什么不干脆省略
\u testId
上的检查,只说
ramTest.result=\u testRes

我现在知道你需要什么了,这是我给你的答案:

public enum Test_ID
{
  Type_MASK = 100,

  RAM    = 100,
  RAM_01 = 101,
  RAM_02 = 102,
  RAM_03 = 103,
  VIDEO    = 200,
  VIDEO_01 = 201,
  VIDEO_02 = 202,
}

public enum Test_Result
{
  nothing = 0,
  OK   = 1,
  FAIL = 99,
}
首先,您不应该使用0作为结果值之一,因为0是int变量的默认值。您可能会忘记指定一个值,从而获得无效的测试结果。因此,不要使用0。这对我防止错误有很大帮助

其次,通过使用限定名称,您可以使用枚举的名称来区分测试用例(请参见
enum
类的静态函数,即
enum.GetNames()
)。更简单的方法是使用枚举的值,并使用除法和模法将值分成组:

(This is C++/CLI, copied from my own code and variables renamed. You can easily convert it to C#)

public ref class CTestCase abstract
{
public:
  static Test_ID Type (Test_ID i_enTest)
  {
    return i_enTest- static_cast<Test>(Number(i_enTest));
  }

  static Test_ID Type (int i_iTest)
  {
    return static_cast<Test_ID>(i_iTest- Number(i_iTest));
  }

  static int Number (Test_ID i_enTest)
  {
    int iNumber = static_cast<int>(i_enTest) % static_cast<int>(Test_ID::Type_MASK);
    return iNumber;
  }

  static int Number (int i_iTest)
  {
    int iNumber = i_iTest% static_cast<int>(Test_ID::Type_MASK);
    return iNumber;
  }
};
(这是C++/CLI,复制自我自己的代码并重命名变量。您可以轻松地将其转换为C#)
公共引用类CTTestCase摘要
{
公众:
静态测试ID类型(测试ID i测试)
{
返回i_enTest-静态i_cast(数字i_enTest));
}
静态测试ID类型(内部测试)
{
返回静态_cast(i_iTest-Number(i_iTest));
}
静态整数(测试ID输入测试)
{
int iNumber=static_cast(i_enTest)%static_cast(Test_ID::Type_MASK);
返回数;
}
静态整数(整数)
{
int iNumber=i_iTest%static_cast(测试ID::Type_MASK);
返回数;
}
};

这不是最终的解决方案,但我想你会得到其余的。;-

除了所有的排列,你还想要什么?对我来说,这些不是测试用例,而是结果组合。当我假设你不想要所有排列,而只想要某些排列时,我是对的吗?就像你不想要不同“组”的测试结果的任何组合一样(testID=1 testRES=OK和testID=4 testRES=Fail将是无效的组合)?我认为这很容易做到。只要告诉我你是否需要。是的,你是对的。不同组的测试结果组合将无效。嗨,威廉,谢谢你的及时回复。我已尝试编辑我的问题,以便更清楚。谢谢你解决了我的一个问题,那就是获得所有的置换两个枚举的ns。我使用了“Tuple”而不是“Pair”,因为我在c#4.0中找不到“Pair”类。但我试图做的是创建不同类型的测试用例,如我的问题所示。但我被卡住了。