C# 处理电路图逻辑关系-串并联

C# 处理电路图逻辑关系-开关串并联

对电路进行仿真,需要对电路图上的设备,主要是开关,进行关系模型创建,实现对电路判断输出是否有电。

串联开关对于的“与”关系,有一个不同这条路就不通;并联开关对应的是“或”关系,有一个通这条路就通。

设计:

&或者,表示串联关系,用|表示并联关系,在这里判断逻辑关系时,并联优先于串联,对于并联电路用[],表示,对于内部的串联电路,用()
示例:
在这里插入图片描述
A和B串联,表示字符串:A&B

在这里插入图片描述
A和B并联,表示字符串:A|B

在这里插入图片描述
B和C并联,A和BC串联,表示字符串为A,[B|C]

在这里插入图片描述
复杂的串并联,表示字符串A,[(B,C)|D]

测试

测试一个复杂电路字符串:
10000001,[10000002|10000003],[(10000004,10000005)|(10000006,[(10000007,10000008)|(10000009,10000010)|(10000011,10000012,110000012)|(10000013,10000014,10000015)])]
在这里插入图片描述

处理代码:

static bool SplitString(string str, char sign = ',')
        {
            bool res = true;//初始为true,输入有电
            bool isAnd = sign == ',';
            //正则(比普通拆分速度还要慢)
            //Regex regex = new Regex(",(?=[^\\)]*(?:\\(|$))");
            //if (!isAnd)
            //{
            //    regex = new Regex(@"\|(?=[^\)]*(?:\(|$))");
            //}
            //var values = regex.Split(str);
            //普通直接拆分
            string[] values;
            if (isAnd)
            {
                values = str.Split(',');
            }
            else
            {
                values = str.Split("|");
            }
            List<string> list = new List<string>();
            //判断拆分,合并字符串,实现要求的拆分
            string tmp = "";
            for (int i = 0; i < values.Length; i++)
            {
                tmp += values[i];
                if (Regex.IsMatch(tmp, "^[0-9]*$"))
                {
                    list.Add(values[i]);
                    tmp = "";
                    continue;
                }
                if (MidBracketMatch(tmp) == 0 && SmallBracketMatch(tmp) == 0)
                {
                    list.Add(tmp);
                    tmp = "";
                    continue;
                }
                tmp += sign;
            }
            //测试打印
            //Console.WriteLine("进入的字符串: " + str);
            //foreach (var item in list)
            //{
            //    Console.Write(item + "  ");
            //}
            //Console.WriteLine();
            //Console.WriteLine("--------处理完成---------");
            //处理判断开关值
            for (int i = 0; i < list.Count; i++)
            {
                if (Regex.IsMatch(list[i], "^[0-9]*$"))
                {
                    if (isAnd)
                    {
                        res = res && GetValue(list[i]);

                    }
                    else
                    {
                        res = res || GetValue(list[i]);
                    }
                    continue;
                }
                else
                {
                    var value = list[i].Substring(1, list[i].Length - 2);
                    bool subRes = false;
                    if (list[i][0] == '[')
                    {
                        subRes= SplitString(value,'|');
                    }
                    else
                    {
                        subRes= SplitString(value, ',');
                    }
                    if (isAnd)
                    {
                        res = res && subRes;

                    }
                    else
                    {
                        res = res || subRes;
                    }
                }
            }
            return res;
        }

其他的一些方法和属性

上面处理函数SplitString中调用的函数和属性

 		/// <summary>
        /// 设备开关键值对
        /// </summary>
       public  static Dictionary<string,bool> DeviceValues=new Dictionary<string,bool>();
  		/// <summary>
        /// 判断中括号是否成对
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static int MidBracketMatch(string str)
        {
            return str.Count(x => x == '[') - str.Count(x => x == ']');
        }

        /// <summary>
        /// 判断小括号是否成对
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static int SmallBracketMatch(string str)
        {
            return str.Count(x => x == '(') - str.Count(x => x == ')');
        }

        /// <summary>
        /// 获取设备的开关值
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool GetValue(string id)
        {
            return DeviceValues[id];
        }

测试结果:
在这里插入图片描述
大概思路和实现方法就是这样,有问题后续修改

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海盗Sharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值