C# - 按排序顺序获取所有环境变量

问题描述 投票:0回答:1

我正在尝试使用返回 IDictionary 的 System.Environment.GetEnvironmentVariables() 获取所有环境变量的排序列表以进行日志记录。

根据文档IDictionary不提供任何排序功能: 字典接口

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);
c# .net environment-variables
1个回答
9
投票

Environment.GetEnvironmentVariables()
返回非泛型
IDictionary
IDictionary
实现了
IEnumerable
,尽管在不阅读文档的情况下从界面上看不清楚,但迭代它时得到的每个成员都是
DictionaryEntry

A

DictionaryEntry
基本上只是一个预泛型
KeyValuePair<object, object>

Linq 提供了两种从非泛型

IEnumerable
移动到泛型
IEnumerable<T>
的方法:
Cast<T>()
OfType<T>()
。在这种情况下,因为我们知道每个元素都是
DictionaryEntry
,所以我们可以使用
Cast<DictionaryEntry>()

所以:

var entries = Environment.GetEnvironmentVariables().Cast<DictionaryEntry>();

现在我们有了一个

IEnumerable<DictionaryEntry>
。我们可以这样排序:

var sortedEntries = entries.OrderBy(x => (string)x.Key);

或者我们可以先将其变成

KeyValuePair<string, string>
,以使其更易于使用:

var entries = Environment.GetEnvironmentVariables().Cast<DictionaryEntry>()
    .Select(x => KeyValuePair.Create((string)x.Key, (string)x.Value));
var sortedEntries = entries.OrderBy(x => x.Key);
© www.soinside.com 2019 - 2024. All rights reserved.