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);
}
我需要通过从 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);
}