return 结果在 foreach 内没有迭代

return results without iteration inside of a foreach

我需要通过从 table 存储加载连接信息来创建一个 ConnectionInfo 对象:

    public static async Task<ConnectionInfo> LoadConnection(CloudTable cloudTable, string container)
    {
        var filter = TableQuery.GenerateFilterCondition("container", QueryComparisons.Equal, container);

        foreach (var entity in await cloudTable.ExecuteQuerySegmentedAsync(new TableQuery<SftpServerConnectionsModel>().Where(filter), null))
        {
            return new ConnectionInfo(entity.uri, entity.user, new AuthenticationMethod[]{
            new PasswordAuthenticationMethod(entity.user,entity.password)});
        }
    }

如何创建 ConnectionInfo 对象并立即 return,而不是继续在 foreach 循环内迭代?

我们可以完全绕过foreach吗?我总是期待 1 个且只有 1 个结果。

基于"I'm always expecting 1 and only 1 result." 为什么首先要循环?

如果循环必须发生,这意味着connectionInfo没有在第一次循环时设置,这意味着你需要找出它何时被设置或实例化,然后停止循环。你最好的选择是检查实体变量

这正是 break 的用途。在循环外声明 connectionInfo,然后一旦分配就跳出它。

ConnectionInfo connectionInfo = null;
foreach (var entity in await cloudTable.ExecuteQuerySegmentedAsync(new TableQuery<SftpServerConnectionsModel>().Where(filter), null))
    {
        connectionInfo = new ConnectionInfo(entity.uri, entity.user, new AuthenticationMethod[]{
        new PasswordAuthenticationMethod(entity.user,entity.password)});
        //If entity is not null break out
        break;
    }

另一个更漂亮的解决方案是使用 while 循环,while with the whole await variable.Any(), 然后做同样的检查

由于您总是期待 1 个且只有 1 个结果,您可以只对 ExecuteQuerySegmentedAsync 的结果执行 .Single() 而不是使用 foreach 迭代它们:

public static async Task<ConnectionInfo> LoadConnection(CloudTable cloudTable, string container) 
{ 
    var filter = TableQuery.GenerateFilterCondition("container", QueryComparisons.Equal, container);

    var entity = (await cloudTable.ExecuteQuerySegmentedAsync(new TableQuery<SftpServerConnectionsModel>().Where(filter), null)).Single();

    return new ConnectionInfo(entity.uri, entity.user, new AuthenticationMethod[] { new PasswordAuthenticationMethod(entity.user,entity.password)});
}

您当前使用的 foreach 方法实际上将 return 用于迭代的第一项,之后不会继续迭代任何其他结果。但是,像这样执行 .Single() 会使该方法更清楚它的预期功能。

如果只期望 1 个结果,则明确请求它

例如

public static async Task<ConnectionInfo> LoadConnection(CloudTable cloudTable, string container) {
    var filter = TableQuery.GenerateFilterCondition("container", QueryComparisons.Equal, container);
    var query = new TableQuery<SftpServerConnectionsModel>().Where(filter);
    var querySegment = await cloudTable.ExecuteQuerySegmentedAsync(query, null);
    var entity = querySegment.FirstOrDefault();
    if(entity != null) {
        return new ConnectionInfo(entity.uri, entity.user, new AuthenticationMethod[]{
        new PasswordAuthenticationMethod(entity.user,entity.password)});
    }
    return default(ConnectionInfo);
}