小编Ale*_*øst的帖子

延迟检索用作 IEnumerable 的数组

我可以访问公开 的数组的 API T,即有一个签名

T[] Get();
Run Code Online (Sandbox Code Playgroud)

我正在创建一个对Ts执行计算并生成T2. 每次调用 toGet()都是昂贵的,并且每次从Tto投影T2都是昂贵的。我可能不需要所有的T2s,所以我想公开:

IEnumerable<T2> GetProjected(); 
Run Code Online (Sandbox Code Playgroud)

现在,我意识到我无能为力让自己变得Get()懒惰。我需要检索整个数组。但是,我希望能够在没有它GetProjected()IEnumerable<T2>情况下立即调用并获得一个Get()调用。换句话说,以下两个实现是不好的:

public IEnumerable<T2> GetProjected()
{
    var items = _api.Get(); // bad!

    return items.Select(t => ProjectToT2(t));
}

public IEnumerable<T2> GetProjected2()
{
    var items = new Lazy<IEnumerable<T>(() => _api.Get());

    return items
        .Value // bad again!
        .Select(t => ProjectToT2(t));
}
Run Code Online (Sandbox Code Playgroud)

你可能会明白我的意思。如何在IEnumerable<T2>不立即调用的情况下公开Get()?我是否必须实现自定义IEnumerator<T2>IEnumerable<T2>配对?

c#

1
推荐指数
1
解决办法
61
查看次数

在可空范式中使用“Try...”方法

一方面,我是Nullables 的忠实粉丝,我认为这是自 LINQ 以来实现 C# 代码流的最伟大的事情。然而,这种改造确实会导致一些怪异。我相信我们都经历过Try...Nullables存在的情况下使用方法。这没有多大意义。以下方法签名是可怕的:

    bool TryFindValue(Key key, Value? value);
Run Code Online (Sandbox Code Playgroud)

一个明显的问题是实现可能返回 true 和 out null。此外,编译器并没有真正很好地处理它,所以你需要使用!(即使你实际上不能保证它不是null),所以你也应该进行空检查(这就是使这种模式不工作)。好的,那该怎么办?嗯,这很明显。你做这个:

    Value? FindValue(Key key);
Run Code Online (Sandbox Code Playgroud)

好的。bool 和 value 都包含在一种类型中。但这让我经常做的其他事情有点尴尬。假设我之前有以下内容:

    if(boolValue && TryFindValue(key, out var value))
        DoSomethingWith(value);
    else
        DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)

假设 TryFindValue() 相对昂贵;除非boolValue是真的,否则我不想这样做。我现在如何写得干净利落?也许这个?

Value? value = boolValue ? FindValue(key) : null;
if(value != null)
    DoSomethingWith(value);
else
    DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)

这并不可怕,但关于它的一些事情仍然困扰着我。我有一种感觉,?:如果有多个条件,模式可能会变得有点难以理解。有没有人对更好的模式有建议,或者这是我们现在能做的最好的吗?

c# nullable

0
推荐指数
1
解决办法
46
查看次数

标签 统计

c# ×2

nullable ×1