簡體   English   中英

Foreach在Foreach中同時進行迭代

[英]Foreach in Foreach iterate at the same

我想知道如何從第一個foreach循環和第二個foreach循環中同時向字典添加項目。

例如-第一個循環將第一個內容添加到項目,並啟動第二個循環,我希望它在循環中添加第一個項目,然后在不讀取第二個項目的情況下啟動外部循環。 這樣做,並從第二個循環中添加第二個項目。

對不起,如果這個問題令人困惑。

List<object> items = new List<object>();
DeviceSettings deviceSettings = new DeviceSettings();
List<object> deviceName = deviceSettings.GetMonitorFriendlyName();

using (ManagementObjectCollection moc = searcher.Get())
{  
    foreach (ManagementObject mo in moc)
    {
        Dictionary<string, object> item = new Dictionary<string, object>();
        ConnectedMonitor_Number = searcher.Get().Count;

        item.Add("DefaultMonitorLength", DefaultMonitor_Width);
        item.Add("DefaultMonitorHeight", DefaultMonitor_Height);
        item.Add("ConnectedMonitor_Numb", Convert.ToString(ConnectedMonitor_Number));
        item.Add("Caption", Convert.ToString(mo["Caption"]));
        item.Add("Name", Convert.ToString(mo["Name"]));
        item.Add("Description", Convert.ToString(mo["Description"]));
        item.Add("DeviceID", Convert.ToString(mo["DeviceID"]));
        item.Add("Manufacturer", Convert.ToString(mo["Manufacturer"]));
        string[] HardwareID = (string[])mo["HardwareID"];
        item.Add("HardwareID", string.Join(";", HardwareID));
        item.Add("Status", Convert.ToString(mo["Status"]));

        foreach (Dictionary<string, string> dm in deviceName)
        {
            item["monitorname"] = Convert.ToString(dm["monitorname"]);
        }

        items.Add(item);
    }
}

---這是devicesettings.cs-

public static string MonitorFriendlyName(LUID adapterId, uint targetId)
    {
        DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME();
        deviceName.header.size = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_TARGET_DEVICE_NAME));
        deviceName.header.adapterId = adapterId;
        deviceName.header.id = targetId;
        deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
        int error = DisplayConfigGetDeviceInfo(ref deviceName);
        if (error != ERROR_SUCCESS)
            throw new Win32Exception(error);
        return deviceName.monitorFriendlyDeviceName;
    }

    public List<object> GetMonitorFriendlyName()
    {
        try
        {
            List<object> items = new List<object>();
            uint PathCount, ModeCount;
            int error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
                out PathCount, out ModeCount);
            if (error != ERROR_SUCCESS)
            {
                throw new Win32Exception(error);
            }

            DISPLAYCONFIG_PATH_INFO[] DisplayPaths = new DISPLAYCONFIG_PATH_INFO[PathCount];
            DISPLAYCONFIG_MODE_INFO[] DisplayModes = new DISPLAYCONFIG_MODE_INFO[ModeCount];
            error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
                ref PathCount, DisplayPaths, ref ModeCount, DisplayModes, IntPtr.Zero);

            for (int i = 1; i < ModeCount; i++)
            {
                if (DisplayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
                {
                    Dictionary<string, string> item = new Dictionary<string, string>();

                    item["MonitorName"] = (MonitorFriendlyName(DisplayModes[i].adapterId, DisplayModes[i].id));
                    items.Add(item);


                }
            }

            return items;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }


    }

每次迭代時,您似乎都覆蓋了字典條目中的monitorname鍵。 這會將每個項目設置為具有相同的監視器名稱。 嘗試這樣的事情:

List<object> items = new List<object>();
DeviceSettings deviceSettings = new DeviceSettings();
List<object> deviceNames = deviceSettings.GetMonitorFriendlyName();

using (ManagementObjectCollection moc = searcher.Get())
{
    var managementObjects = moc.Cast<ManagementObject>().ToArray();
    ConnectedMonitor_Number = managementObjects.Length;

    for (int i = 0; i < managementObjects.Length; i++)
    {
        object device = deviceNames[i];
        ManagementObject mo = managementObjects[i];

        Dictionary<string, object> item = new Dictionary<string, object>
        {
            { "DefaultMonitorLength", DefaultMonitor_Width },
            { "DefaultMonitorHeight", DefaultMonitor_Height },
            { "ConnectedMonitor_Numb", Convert.ToString(ConnectedMonitor_Number) },
            { "Caption", Convert.ToString(mo["Caption"]) },
            { "Name", Convert.ToString(mo["Name"]) },
            { "Description", Convert.ToString(mo["Description"]) },
            { "DeviceID", Convert.ToString(mo["DeviceID"]) },
            { "Manufacturer", Convert.ToString(mo["Manufacturer"]) },
            { "HardwareID", string.Join(";", (string[])mo["HardwareID"]) },
            { "Status", Convert.ToString(mo["Status"]) },
            { "monitorname", Convert.ToString(device["monitorname"])}
        };

        items.Add(item);
    }
}

請注意,這不會編譯,因為您將deviceNames聲明為List<object>但似乎將其視為Dictionary<string,string>對待。 我們沒有看到演員表嗎? 同樣,此答案基於您僅搜索連接的顯示器的假設。

更新:

看到您從中復制源代碼的位置 ,您需要將代碼恢復為原始作者的操作。 如果您確實想要字典,則需要從上方選擇一個可以綁定到WMI搜索結果中的鍵。

查看更新的代碼后進行編輯。

您的代碼似乎全亂了,我敢肯定它甚至沒有完全執行。

您在詞典列表( List<object> items )中使用相同的鍵作為詞典( Dictionary<string, string> item )。 這意味着在任何給定時間, 的詞典中都只有一個值 您要通過什么來實現?

現在 ,來到您的問題,您試圖在其中遍歷第二個foreach一次並退出。

我在這里看到一個重大問題。 您試圖訪問 “ monitorname”的值,而在源頭,您正在將值分配給 “ MonitorName”。

  1. 根據字典的初始化,字典中的鍵區分大小寫,在這里您嘗試訪問錯誤的鍵。
  2. 由於您在詞典中始終只有一個鍵為“ MonitorName”的條目,因此此行代碼在運行時引發KeyNotFoundException

但是您已經報告了增加break; 到第二個foreach中斷第一個foreach 我的猜測是,您甚至還沒有調試代碼,而是根據所獲得的輸出在假設條件下發布了問題。 這是由於運行時異常而不是由於break; 不能按預期工作。

盡管您的代碼中有很多不清楚的地方,但我假設您有充分的理由采用這種方式。

以下代碼可以解決您的問題:

    foreach (Dictionary<string, string> dm in deviceName)
    {
        item["monitorname"] = Convert.ToString(dm["MonitorName"]);
        break;
    }

注意 dm["MonitorName"] ,我在其中將密鑰從“ monitorname”更新為“ MonitorName”。

記得訪問item["monitorname"]使用正確的密鑰

希望這可以幫助!

如果我有您的問題,這可能是您要尋找的邏輯(不確定)。 使用外循環僅保存項目,使用內循環進行實際操作。

 foreach (ManagementObject mo in moc)
{
   foreach (item-no-n mo in ManagementObject )
    {
      ///1st item loop to n-item
    }
   foreach (item-no-n mo in ManagementObject )
    {
      ///1st item loop to n-item
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM