【发布时间】:2016-10-06 05:34:30
【问题描述】:
我正在编写一个控制台应用程序,它可以调用 web 服务并接收返回的 XML,其中 XML 将是“文件夹”或“文档”的条目。我在 C# 中编写了以下 do while 循环来循环调用 web 服务,但我想知道是否有更实用的方法来做到这一点:
...
var documentUrls = new Dictionary<string, string>();
// get the root folder's children
var rootFeed = $"{baseUrl}/biprws/infostore/{23}/children"
.Do(str => Console.WriteLine($"{str}:"))
.GetResponse(headerToken)
.GetXmlString()
.DeserializeFromXml<Library.Children.Feed>();
var folderUrls = rootFeed.Entries
.Where(entry => entry.Content.ContentContainsFolderUrl(type: "folder"))
.Select(entry => $"{entry.Link.Href}/children")
.ToList();
// go through each folder and pull out the documents - if a nested folder is found then check that too
do
{
var feeds = folderUrls
.Select(url => url.GetResponse(headerToken).GetXmlString().DeserializeFromXml<Library.Children.Feed>())
.SelectMany(x => x.Entries);
var folders = feeds
.Where(entry => entry.Content.ContentContainsFolderUrl(type: "Folder"))
.Select(x => $"{x.Link.Href}/children")
.ToList();
var documents = feeds
.Where(entry => entry.Content.ContentContainsFolderUrl(type: "webi"))
.ToDictionary(
keySelector: x => x.Content.Attrs.Attr.Where(y => y.Name.ToLower() == "id").First().Text,
elementSelector: x => x.Content.Attrs.Attr.Where(y => y.Name.ToLower() == "name").First().Text);
// if there are no more folders or documents to check, break out of this while loop
if (!documents.Any() && !folders.Any())
break;
Console.WriteLine($"Got {folders.Count} folders and {documents.Count} documents");
folderUrls.RemoveAll(x => true); // remove all the folder urls as they have already been checked!!!!
folderUrls.AddRange(folders);
documents.ForEachDo(x => documentUrls.Add(x.Key, x.Value));
} while (true);
Console.WriteLine($"There are {documentUrls.Count()} {nameof(documentUrls)}");
...
【问题讨论】:
-
结束条件是什么?你的 do..while 循环目前是无止境的。在haskell中,是否将其实现为递归调用?但是通过无休止的递归调用,您可能会收到 stackoverflow 异常。
-
既然它只是一个无限循环,你不妨做一个普通的
while循环。 -
一种更“实用”的方法是使用递归,但在添加错误处理时,你所拥有的很好,并且在许多方面更可取。文件夹的
Queue<T>会比您不断擦除的列表更整洁。 -
@juharr 中断意味着它不是无限的。
-
@TryToSolveItSimple 当没有找到更多文档或文件夹时,其中有一个
break。
标签: c# functional-programming do-while