0

所以我试图在 C# 中创建一个真值表,以便我可以在其上执行一些布尔代数。假设它是一个 8 行的三变量真值表。到目前为止,我正在尝试使用数组的字符串数组来输入真值表。

string[][] truthTable = new string[8][];
            truthTable[0] = new string[2] { "1" , "000"};
            truthTable[1] = new string[2] { "0", "001" };
            truthTable[2] = new string[2] { "0", "010" };
            truthTable[3] = new string[2] { "0", "011" };
            truthTable[4] = new string[2] { "0", "100" };
            truthTable[5] = new string[2] { "1", "101" };
            truthTable[6] = new string[2] { "1", "110" };
            truthTable[7] = new string[2] { "1", "111" };





            for (int i = 0; i < truthTable.Length; i++)
            {
                // print out strings  that have "1 as first element"
                if (truthTable[i].GetValue(i) == "1" )

                {
                    Console.WriteLine(truthTable[i]);

                }

            }

我现在要做的是打印出第一个元素为“1”的数组。例如,对于第一个数组,控制台输出应该类似于“1”“000”,并且它应该只打印其他三个也具有“1”的数组。但现在它给了我一个越界错误并且不打印任何东西。

这是开始使用真值表来计算产品总和的好方法,还是有更好的方法在 C# 中实现它?

4

1 回答 1

1

一个简单的实现是使用 aDictionary<string, string>代替。键将string保存您的三个变量值,第二个string值将保存相应的真值:

var truthTable = new Dictionary<string, string>
{
    { "000", "1" },
    { "001", "0" },
    { "010", "0" },
    { "011", "0" },
    { "100", "0" },
    { "101", "1" },
    { "110", "1" },
    { "111", "1" },
};

foreach (var keyValue in truthTable)
{
    // print out strings that have value of "1"
    if (keyValue.Value == "1")
    {
        Console.WriteLine(keyValue.Key);
    }
}

虽然可能更符合感兴趣的领域,但您可能会考虑仅使用 a Tupleof bools 代替 astring作为变量键,使用 abool而不是 astring作为值:

var truthTable = new Dictionary<Tuple<bool, bool, bool>, bool>
{
    { new Tuple<bool, bool, bool>(false, true, false), true },
    { new Tuple<bool, bool, bool>(false, true, true), false },
    { new Tuple<bool, bool, bool>(false, false, false), false },
    { new Tuple<bool, bool, bool>(false, false, true), false },
    { new Tuple<bool, bool, bool>(true, true, false), false },
    { new Tuple<bool, bool, bool>(true, true, true), true },
    { new Tuple<bool, bool, bool>(true, false, false), true },
    { new Tuple<bool, bool, bool>(true, false, true), true },
};

foreach (var keyValue in truthTable)
{
    // print out strings that have true value
    if (keyValue.Value)
    {
        Console.WriteLine(keyValue.Key);
    }
}

更新:使用 LinqDictionary

您可以粗略地将Dictionarya 近似为ListKeyValuePair组。这意味着您可以使用任何可用的所有 Linq 功能Collection——例如,上述foreach循环可以使用WhereLinq 扩展方法并简化为以下内容:

// print out strings that have true value
var trueKeyValuesList = truthTable.Where(kv => kv.Value).ToList();
foreach (var keyValue in trueKeyValuesList)
{
    Console.WriteLine(keyValue.Key);
}

在这个例子中,trueKeyValuesList就是 -- List<KeyValuePair<Tuple<bool, bool, bool>, bool>>(I <3 var:P )。如果只是想要一个Tuple值列表,您可以使用SelectLinq 方法(其行为类似于 python 的map)以及Where

// print out strings that have true value
var trueValueKeys = truthTable
    .Where(kv => kv.Value)
    .Select(kv => kv.Key)
    .ToList();
foreach (var boolTuple in trueValueKeys)
{
    Console.WriteLine(boolTuple);
}
于 2019-12-03T17:49:51.690 回答