在下面查看我当前的答案代码。这是一项正在进行的工作,因为 Testdome 说它是 50% 正确的。当前答案代码通过了 Testdome 的 4 个单元测试中的 2 个。这让我感到困惑,因为它通过了我所有的单元测试。
Testdome 单元测试结果:
-
示例案例:正确答案
-
所有文件夹名称以首字母开头:正确答案
-
根文件夹名称以首字母开头:错误答案*
-
复杂的文件夹结构:错误答案*
*上面的错误答案表明:“您的代码为测试用例返回了错误的答案。创建您自己的测试用例以找出代码出错的地方。”
编辑
我还请求了“显示提示”,Testdome 引擎显示了这个:
提示 1:XDocument 提供了一种基于 LINQ 的便捷方法来解析 XML。
这很有趣,因为它会完全改变我的答案。有了这个,我不相信递归函数是必需的。使用 LINQ,可以只从反序列化的 Xml 构建结果列表。我会努力解决这个问题并将我的发现发回......
我的第一个答案代码(使用递归——错误答案——继续阅读):
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
[XmlRoot(ElementName = "folder")]
public class Folder
{
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
[XmlElement(ElementName = "folder")]
public List<Folder> children { get; set; }
}
public class Folders
{
public static IEnumerable<string> FolderNames(string xml, char startingLetter)
{
XmlSerializer serializer = new XmlSerializer(typeof(Folder));
StringReader reader = new StringReader(xml);
Folder folders = (Folder)serializer.Deserialize(reader);
searchFolders(folders, startingLetter);
reader.Close();
return searchFolderResults;
}
private static List<string> searchFolderResults = new List<string>();
private static void searchFolders(Folder node, char startingLetter)
{
if (node.Name.StartsWith(startingLetter.ToString()))
{
searchFolderResults.Add(node.Name);
}
foreach (Folder folder in node.children)
searchFolders(folder, startingLetter);
}
public static void Main(string[] args)
{
string xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<folder name=\"c\">" +
"<folder name=\"program files\">" +
"<folder name=\"uninstall information\" />" +
"<folder name=\"cusers3\" />" +
"</folder>" +
"<folder name=\"users\">" +
"<folder name=\"users2\" />" +
"</folder>" +
"</folder>";
foreach (string name in Folders.FolderNames(xml, 'c'))
Console.WriteLine(name);
}
}
编辑
我的最新代码(使用 XDocument 和 LINQ,并通过了另一个单元测试):
Testdome 单元测试结果:
-
示例案例:正确答案
-
所有文件夹名称以首字母开头:正确答案
-
根文件夹名称以首字母开头:正确答案
-
复杂的文件夹结构:错误答案*
*上面的错误答案表明:“您的代码为测试用例返回了错误的答案。创建您自己的测试用例以找出代码出错的地方。”
我再次点击“显示提示”,现在它有第二个提示:
提示 2:可能还需要考虑文档的根节点。
所以我再次离开继续工作,直到解决所有 Testdome 单元测试。他们声称这是一个困难的 C# 问题。我想……
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
[XmlRoot(ElementName = "folder")]
public class Folder
{
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
[XmlElement(ElementName = "folder")]
public List<Folder> children { get; set; }
}
public class Folders
{
public static IEnumerable<string> FolderNames(string xml, char startingLetter)
{
return
from row in XDocument.Parse(xml).Descendants()
where row.FirstAttribute.Value.StartsWith(startingLetter.ToString())
select row.FirstAttribute.Value;
}
public static void Main(string[] args)
{
string xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<folder name=\"c\">" +
"<folder name=\"program files\">" +
"<folder name=\"uninstall information\" />" +
"<folder name=\"cusers3\" />" +
"</folder>" +
"<folder name=\"users\">" +
"<folder name=\"users2\" />" +
"</folder>" +
"</folder>";
foreach (string name in Folders.FolderNames(xml, 'c'))
Console.WriteLine(name);
}
}
最后编辑(我保证)
我在上面的最新答案(涉及 XDocument 和 LINQ)的问题是我使用了 Contains 而不是 StartsWith,并且在搜索“u”时未过滤“cusers3”的复杂测试中失败了”。更正此逻辑后,它在 Testdome 的测试引擎中完美运行。谢谢!!
顺便说一句..第二个提示(见上文)是red herring(不是可疑的那种)。