C# - 按排序顺序获取所有环境变量
C# - Get all environment variables in sorted order
我正在尝试使用 System.Environment.GetEnvironmentVariables() 获取所有环境变量的排序列表以用于记录目的,其中 returns 一个 IDictionary。
根据文档 IDictionary 不提供任何排序功能:
IDictionary Interface
The IDictionary interface allows the contained keys and values to be enumerated, but it does not imply any particular sort order.
作为一种解决方法,我想出了这样的方法:
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);
更新
由于的解决办法,我把上面的代码改成这样:
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);
Environment.GetEnvironmentVariables()
returns一个non-genericIDictionary
。 IDictionary
实现了 IEnumerable
,即使在不阅读文档的情况下从界面上不清楚这一点,但在迭代它时获得的每个成员都是 DictionaryEntry
.
一个DictionaryEntry
基本上就是一个pre-genericsKeyValuePair<object, object>
.
Linq 提供了两种从 non-generic IEnumerable
到通用 IEnumerable<T>
的方法:Cast<T>()
和 OfType<T>()
。在这种情况下,因为我们知道每个元素都是 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);
我正在尝试使用 System.Environment.GetEnvironmentVariables() 获取所有环境变量的排序列表以用于记录目的,其中 returns 一个 IDictionary。
根据文档 IDictionary 不提供任何排序功能: IDictionary Interface
The IDictionary interface allows the contained keys and values to be enumerated, but it does not imply any particular sort order.
作为一种解决方法,我想出了这样的方法:
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);
更新
由于
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);
Environment.GetEnvironmentVariables()
returns一个non-genericIDictionary
。 IDictionary
实现了 IEnumerable
,即使在不阅读文档的情况下从界面上不清楚这一点,但在迭代它时获得的每个成员都是 DictionaryEntry
.
一个DictionaryEntry
基本上就是一个pre-genericsKeyValuePair<object, object>
.
Linq 提供了两种从 non-generic IEnumerable
到通用 IEnumerable<T>
的方法:Cast<T>()
和 OfType<T>()
。在这种情况下,因为我们知道每个元素都是 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);