如何解决如何从 C# .NET 中的类型化私有变量公开 IEnumerable 的 IEnumerable
这可能是一个愚蠢的问题,但是...
是否可以表达:
private Dictionary<decimal,List<string>> _internal;
作为
public IEnumerable<KeyValuePair<decimal,IEnumerable<string>>> External => something.idontknow...
通常我只使用 .AsEnumerable() 但这显然只返回字典的 IEnumerable。
如果这是可能的,我将如何通过在一行中指定两个 IEnumerable 的过滤器(例如 .Where())来调用这个公共变量,以便过滤后的结果是两者的结果?
我希望这是有道理的。
解决方法
您不能直接公开值(没有某种转换)。您会认为因为 Dictionary<K,V>
是 IEnumerable<KeyValuePair<K,V>>
而 List<T>
是 IEnumerable<T>
,所以这应该很简单。不幸的是,它不是 KeyValuePair<K,List<V>>
is not KeyValuePair<K,IEnumerable<V>>
,因为类(以及本例中的结构)是不变的。
您有几个选择,但它们都将涉及某种来源的投影。第一个是简单地 Select
一个新的可枚举,手动转换 KeyValuePair<,>
:
private Dictionary<decimal,List<string>> _internal = new();
public IEnumerable<KeyValuePair<decimal,IEnumerable<string>>> External
=> _internal.Select(
c => new KeyValuePair<decimal,IEnumerable<string>>(c.Key,c.Value));
第二个选择是投影到一个新的字典:
private Dictionary<decimal,IEnumerable<string>>> External
=> _internal.ToDictionary(c => c.Key,c => (IEnumerable<string>) c.Value);
我不会走那条路,因为它会不必要地分配并必须重新计算散列等。但我还是想把它叫出来。
第三个选项是自定义迭代器方法:
private Dictionary<decimal,IEnumerable<string>>> External() {
foreach(var (key,value) in _internal)
yield return new KeyValuePair<decimal,IEnumerable<string>>(key,value);
}
或者,您可以将转换迭代器 method 设为私有,然后使用另一个属性来调用它(如果您希望通过 property 语法进行外部使用):
private Dictionary<decimal,List<string>> _internal = new();
private IEnumerable<KeyValuePair<decimal,IEnumerable<string>>> Iterator() {
foreach(var (key,value);
}
public IEnumerable<KeyValuePair<decimal,IEnumerable<string>>> External => Iterator();
请参阅此 SharpLab link 以了解所有四种操作的示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。