【问题标题】:c# for loop in switch/case situation - how to?c# for loop 在 switch/case 情况下 - 如何?
【发布时间】:2020-04-04 16:15:18
【问题描述】:

我正在尝试在 c# 中扩展给定的代码,但由于缺乏编程经验,我有点卡住了。

使用 Visual Studio 社区,我试图通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称的外壳,即CPU Core #1并给出温度。对于每个 CPU 核心。拥有 64 个内核,这相当于复制粘贴。我试图实现一个 foreach-situation 但它不起作用。另外我不知道如何在这里设置for循环。

这是有问题的代码:

if (s.SensorType == LibreHardwareMonitor.Hardware.SensorType.Temperature)
{
    if (s.Value != null)
    {
        float curTemp = (float)s.Value;
        switch (s.Name)
        {
            case "Core Average": //average temps
                cpuTemp = curTemp.ToString();
                Console.WriteLine(" ... ");
                Console.WriteLine(" CPU AVG TEMP: " + cpuTemp);
                Console.WriteLine(" ... ");
                break;

            case "CPU Core #": //Temps for CPU Core #1, CPU Core #2 ...
                foreach (s.Name in LibreHardwareMonitor...? ) // <-- no clue what to do here
                {
                    int i = 1;
                    cpuTemp = curTemp.ToString();
                    Console.WriteLine(" ... ");
                    Console.WriteLine(" CPU #" + i +" TEMP: " + cpuTemp);
                    Console.WriteLine(" ... ");
                    i++;
                }                    
                break;
        }
    }
}

我被卡住了,不知道如何实现以吐出所有 CPU Core#1CPU Core#64 温度。

完整代码如下:

private void dataCheck(object StateObj)
{
    string cpuTempA = ""; 
    string cpuTemp = "";
    string gpuTemp = "";
    string gpuLoad = "";
    string cpuLoad = "";
    string dataUsed = "";
    string fanUsed = "";
    string cpuClock = "";
    //;
    StateObjClass State = (StateObjClass)StateObj;
    // enumerating all the hardware
    foreach (LibreHardwareMonitor.Hardware.IHardware hw in thisComputer.Hardware)
    {
        Console.WriteLine("HARDWARE: " + hw.HardwareType);
        Console.ReadLine();

        hw.Update();
        // searching for all sensors and adding data to listbox
        foreach (LibreHardwareMonitor.Hardware.ISensor s in hw.Sensors)
        {
            Console.WriteLine("NAME: " + s.Name + ", TYPE: " + s.SensorType + ", VALUE: " + s.Value);
            Console.ReadLine();

            if (s.SensorType == LibreHardwareMonitor.Hardware.SensorType.Temperature)
            {
                Console.WriteLine(" FOUND " + s.SensorType);
                if (s.Value != null)
                {
                    Console.WriteLine(" FOUND VALUE " + s.Value);
                    float curTemp = (float)s.Value;
                    switch (s.Name)
                    {
                        case "Core Average":
                            Console.WriteLine(" FOUND NAME " + s.Name);
                            cpuTempA = curTemp.ToString();

                            Console.WriteLine(" ... ");
                            Console.WriteLine(" CPU AVG TEMP: " + cpuTempA);
                            Console.WriteLine(" ... ");
                            break;

                        case "CPU Core #": //CPU Core #1, CPU Core #2 ...
                            foreach (s.Name in LibreHardwareMonitor...? )
                            {
                                int i = 1;
                                cpuTemp = curTemp.ToString();
                                Console.WriteLine(" ... ");
                                Console.WriteLine(" CPU #" + i +" TEMP: " + cpuTemp);
                                Console.WriteLine(" ... ");
                                i++;
                            }                    
                            break;

                        }
                    }
                }

                if (s.SensorType == LibreHardwareMonitor.Hardware.SensorType.Clock)
                {
                    Console.WriteLine(" FOUND " + s.SensorType);
                    if (s.Value != null)
                    {
                        Console.WriteLine(" FOUND VALUE " + s.Value);
                        float curClock = (float)s.Value;
                        switch (s.Name)
                        {
                            case "CPU Core #4":
                                Console.WriteLine(" FOUND NAME " + s.Name);
                                cpuClock = curClock.ToString();
                                Console.WriteLine(" ... ");
                                Console.WriteLine(" CPU CLOCK: " + cpuClock);
                                Console.WriteLine(" ... ");
                                break;
                        }
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 您能否详细说明“不起作用”?您是否收到编译错误(请说明),是否发生了您没有预料到的事情(您期望什么以及发生了什么)?
  • 它不会运行/编译哈哈 - 我是菜鸟

标签: c# loops for-loop foreach switch-statement


【解决方案1】:

拆分字符串并将#之后的部分转换为整数

if (s.Name.Contains("#")) {
  string core_id_str = s.Name.Split('#')[1]; // gets second part of split
  int core_id = System.Convert.ToInt32(core_id_str); // convert to integer
  // do your magic
}

【讨论】:

    【解决方案2】:

    您不能在此处使用 switch,因为它仅适用于完全相等,而您需要执行以下操作:

    if(s.Name == "Core Average")
    {
       // ...
    }
    else if (s.Name.StartsWith("CPU Core #"))
    {
       int coreid = int.Parse(s.Name.Split('#')[1]);
       // ...  
    }
    

    看起来您不需要进一步的循环,因为 CPU Core 1 .... 64 似乎已经是 thisComputer.Hardware 的一部分。

    【讨论】:

      【解决方案3】:

      谢谢斯蒂芬,这真的很有帮助。非常感谢!

      它在我的 4 核家用电脑上运行良好,但是有另一个项目以 CPU Core # 开头,它的数字后面有一个字符串。我需要找到一种方法来过滤掉后者。也许通过将 if 子句限制为“&& lentgh == 11”之类的东西?

                          if (s.Name.StartsWith("CPU Core #"))
                          {
                              // int coreid = int.Parse(s.Name.Split('#')[1]);
                              string coreid = s.Name.Split('#')[1];
                              coreno = coreid.ToString();
                              Console.WriteLine(">>>>>>>>>>>>> CORE NUMBER " + coreno + " Temp " + s.Value);
                          }
      

      COLSOLE:

      NAME: CPU Core #1, TYPE: Temperature, VALUE: 43
      >>>>>>>>>>>>> CORE NUMBER 1 Temp 43
      NAME: CPU Core #2, TYPE: Temperature, VALUE: 44
      >>>>>>>>>>>>> CORE NUMBER 2 Temp 44
      NAME: CPU Core #3, TYPE: Temperature, VALUE: 43
      >>>>>>>>>>>>> CORE NUMBER 3 Temp 43
      NAME: CPU Core #4, TYPE: Temperature, VALUE: 42
      >>>>>>>>>>>>> CORE NUMBER 4 Temp 42
      NAME: CPU Package, TYPE: Temperature, VALUE: 44
      NAME: CPU Core #1 Distance to TjMax, TYPE: Temperature, VALUE: 57
      >>>>>>>>>>>>> CORE NUMBER 1 Distance to TjMax Temp 57
      NAME: CPU Core #2 Distance to TjMax, TYPE: Temperature, VALUE: 56
      >>>>>>>>>>>>> CORE NUMBER 2 Distance to TjMax Temp 56
      NAME: CPU Core #3 Distance to TjMax, TYPE: Temperature, VALUE: 57
      >>>>>>>>>>>>> CORE NUMBER 3 Distance to TjMax Temp 57
      NAME: CPU Core #4 Distance to TjMax, TYPE: Temperature, VALUE: 58
      >>>>>>>>>>>>> CORE NUMBER 4 Distance to TjMax Temp 58
      

      【讨论】:

      • 你需要调整这个位 int.Parse(s.Name.Split('#')[1]);它仅在字符串具有 CORE ... #1 格式时才有效。名称“CPU Core #1 Distance to TjMax”失败,因为“#1”后面有更多文本。您可能应该尝试类似: int id; foreach(s.Name.Split(' ')中的字符串部分) { if(part.StartsWith("#")) id = int.Parse(part.Split('#')[1]); }
      • 谢谢我修复了一些错误并重新发布了混乱的答案。还在努力中哈哈。非常感谢!
      【解决方案4】:

      解决方案(更新):

                              if (s.Name.StartsWith("CPU Core #") && s.Name.Length == 11)
                              {
      
                                  int coreid = int.Parse(s.Name.Split('#')[1]);
                                  string corenumber = coreid.ToString();
                                  string coreNoTemp = " CORE NUMBER: " + corenumber + " Temp: " + s.Value;
      
                                  coreNoTempStr[coreid] = coreNoTemp.ToString();
      
                                  Console.WriteLine(coreNoTempStr[coreid]);
      
                              }
      

      控制台:

      NAME: CPU Core #1, TYPE: Temperature, VALUE: 44
      CORE NUMBER 1 Temp 44
      NAME: CPU Core #2, TYPE: Temperature, VALUE: 45
      CORE NUMBER 2 Temp 45
      NAME: CPU Core #3, TYPE: Temperature, VALUE: 44
      CORE NUMBER 3 Temp 44
      NAME: CPU Core #4, TYPE: Temperature, VALUE: 44
      CORE NUMBER 4 Temp 44
      

      整个字符串:

      核心数:1 温度:41 核心数:2 温度:42 核心数:3 温度:39 核心数:4 温度:40

      感谢斯特凡!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 2021-10-01
        • 1970-01-01
        • 2020-10-13
        • 2011-05-08
        相关资源
        最近更新 更多