返回结果,而无需在foreach中进行迭代

时间:2019-07-16 23:30:04

标签: c# azure-table-storage

我需要通过从表存储中加载连接信息来创建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对象并立即返回,而不是继续在foreach循环中进行迭代?

我们可以完全绕过foreach吗?我一直期望只有1个结果。

3 个答案:

答案 0 :(得分:1)

基于“我一直期望1个结果,而只有1个结果。”为什么首先要循环播放?

如果必须发生循环,则意味着在第一个循环中未设置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循环,同时使用整个await变量。Any(),然后执行相同的检查

答案 1 :(得分:1)

由于您总是希望得到1个结果,而只有1个结果,因此您可以对parseSomeField()的结果进行.Single(),而不必使用ExecuteQuerySegmentedAsync对其进行迭代:

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,会使该方法在预期操作上更加清晰。

答案 2 :(得分:1)

如果仅期望1个结果,则显式请求它

例如

public class Test {
    private static class Foo {
        private final int a;

        public Foo() throws Exception {
            a = 42;
            throw new Exception();
        }
    }

     public static void main(String []args) throws Exception {
         new Foo();
     }
}