我需要通过从表存储中加载连接信息来创建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个结果。
答案 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();
}
}