【发布时间】:2021-12-18 05:26:10
【问题描述】:
我有当前的功能:
private IEnumerable<string> GetKeysStringValues(RegistryKey key)
{
foreach (var subKey in GetAllSubKeys(key))
{
foreach (var value in subKey.GetValueNames())
{
if (subKey.GetValueKind(value) == RegistryValueKind.String)
{
yield return (string) subKey.GetValue(value);
}
}
}
}
它:
- 解析注册表项的所有子项
- 对于每个子键,解析其所有值
- 如果值为字符串,则将其添加到迭代器中
我担心的是有两个嵌入式 for-each 循环,我一点也不喜欢。 我想把这个函数一分为二。
问题是我最终的返回类型为IEnumerable<IEnumerable<string>>
我尝试只在第二个函数中构建迭代器,并在第一个函数中直接返回它,但是这样做我错过了所有后续调用。
这是导致它的代码:
private IEnumerable<IEnumerable<string>> GetSubKeysStringValues(RegistryKey key)
{
IEnumerable<string> enumerable = Enumerable.Empty<string>();
foreach (var subKey in GetAllSubKeys(key))
{
yield return GetKeysStringValues(subKey));
}
}
private IEnumerable<string> GetKeysStringValues(RegistryKey key)
{
foreach (var value in key.GetValueNames())
{
if (key.GetValueKind(value) == RegistryValueKind.String)
{
yield return (string) key.GetValue(value);
}
}
}
你会怎么做?
编辑:
到目前为止,我有这个解决方案,但可以改进吗?
private IEnumerable<string> GetSubKeysStringValues(RegistryKey key)
{
IEnumerable<string> enumerable = Enumerable.Empty<string>();
foreach (var subKey in GetAllSubKeys(key))
{
enumerable = enumerable.Concat(GetKeysStringValues(subKey));
}
return enumerable;
}
private IEnumerable<string> GetKeysStringValues(RegistryKey key)
{
foreach (var value in key.GetValueNames())
{
if (key.GetValueKind(value) == RegistryValueKind.String)
{
yield return (string) key.GetValue(value);
}
}
}
【问题讨论】:
-
两个foreach有什么问题?您还应该说明导致
IEnumerable<IEnumerable<string>>的原因。 -
两个 foreach 很难进行单元测试,在这种情况下不尊重 SRP
-
我按照你的要求上传了代码
标签: c# iterator generator yield-return