繁体   English   中英

c# for 循环在 switch/case 情况下 - 如何?

[英]c# for loop in switch/case situation - how to?

我正在尝试在 c# 中扩展给定的代码,但由于缺乏编程经验,我有些陷入困境。

使用 Visual Studio 社区,我试图通过控制台读出 CPU 核心温度。 该代码使用开关/外壳来查找传感器特定名称的外壳,即CPU 内核 #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;
                        }
                    }
                }
            }
        }
    }
}

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

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
}

您不能在此处使用 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 的一部分。

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

它在我的 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);
                    }

科尔索:

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

解决方案(更新):

                        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

谢谢斯蒂芬!

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM