[英]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”。
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.