我正在嘗試使用回傳 IDictionary 的 System.Environment.GetEnvironmentVariables() 獲取用于記錄目的的所有環境變數的排序串列。
根據檔案 IDictionary 不提供任何排序??功能: IDictionary Interface
IDictionary 介面允許列舉包含的鍵和值,但它并不暗示任何特定的排序順序。
作為一種解決方法,我想出了這樣的事情:
var dictionary = Environment.GetEnvironmentVariables();
var keyList = dictionary.Keys.OfType<string>().ToList();
keyList.Sort();
int maxKeyLen = keyList.Max(key => ((string)key).Length);
string logMessage = "";
foreach (string key in keyList)
{
logMessage =
logMessage
Environment.NewLine
(key ": ").PadRight(maxKeyLen 2)
dictionary[key];
}
Console.WriteLine(logMessage);
更新
由于@canton7的解決方案,我將上面的代碼更改為:
var sortedEntries = Environment.GetEnvironmentVariables().Cast<DictionaryEntry>().OrderBy(entry => entry.Key);
int maxKeyLen = sortedEntries.Max(entry => ((string)entry.Key).Length);
string logMessage = "";
foreach (var entry in sortedEntries)
{
logMessage =
logMessage
Environment.NewLine
(entry.Key ": ").PadRight(maxKeyLen 2)
entry.Value;
}
Console.WriteLine(logMessage);
uj5u.com熱心網友回復:
Environment.GetEnvironmentVariables()回傳非泛型IDictionary. IDictionaryimplements IEnumerable,即使在不閱讀檔案的情況下從界面上看不清楚,迭代它時獲得的每個成員都是一個DictionaryEntry.
ADictionaryEntry基本上只是一個 pre-generics KeyValuePair<object, object>。
Linq 提供了兩種從非泛型移動IEnumerable到泛型的方法IEnumerable<T>:Cast<T>()和OfType<T>(). 在這種情況下,因為我們知道每個元素都是 a DictionaryEntry,所以我們可以使用Cast<DictionaryEntry>().
所以:
var entries = Environment.GetEnvironmentalVariables().Cast<DictionaryEntry>();
現在我們有了一個IEnumerable<DictionaryEntry>. 我們可以這樣排序:
var sortedEntries = entries.OrderBy(x => (string)x.Key);
或者我們可以把它變成KeyValuePair<string, string>第一個使它更容易使用:
var entries = Environment.GetEnvironmentalVariables().Cast<DictionaryEntry>()
.Select(x => KeyValuePair.Create((string)x.Key, (string)x.Value));
var sortedEntries = entries.OrderBy(x => x.Key);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450027.html
