在VS2010中进行调试时,有没有办法将数组/列表/集合数据保存到文件中?
例如,在此代码中:
var addressGraphs = from a in context.Addresses
where a.CountryRegion == "Canada"
select new { a, a.Contact };
foreach(var ag in addressGraphs) {
Console.WriteLine("LastName: {0}, Addresses: {1}", ag.Contact.LastName.Trim(),
ag.Contact.Addresses.Count());
foreach(var Address in ag.Contact.Addresses) {
Console.WriteLine("...{0} {1}", Address.Street1, Address.City);
}
}
我想在第一个'foreach'行设置断点,然后将'addressGraph'中的数据保存到文件中。
其中'a'包含以下字段:
int addressID
string Street1
string City
<Ect.>
和“联系人”包含以下字段:
string FirstName
string LastName
int contactID
<Ect.>
我希望该文件包含集合中每个项目的每个字段的值。
我没有看到明显的方法来做到这一点。有可能吗?
答案 0 :(得分:26)
当您的断点被点击时,打开Immediate
窗口并使用Tools.LogCommandWindowOutput将输出转储到文件中:
>Tools.LogCommandWindowOutput c:\temp\temp.log
?addressGraphs
>Tools.LogCommandWindowOutput /off
注意:您可以使用Log
<{1}}
Tools.LogCommandWindowOutput
<强>更新强>
>
字符很重要。此外,log
别名区分大小写。
见截图:
答案 1 :(得分:6)
我也遇到过这样的问题,但在VS2013中。我必须在调试时保存数组内容。
例如,我需要保存名为&#34; trimmedInput&#34;的双数组内容。我这样做了:
答案 2 :(得分:2)
使用此方法可以达到类似的效果:
我构建了一个扩展方法,我在我的所有项目中都使用它,这是一个通用且功能更强大的ToString()方法,它显示了任何对象的内容。 我在这个链接中包含了源代码: https://rapidshare.com/files/1791655092/FormatExtensions.cs
<强>更新强> 您只需将FormatExtensions.cs放在项目中,并将FormatExtensions的Namespace更改为与项目的基本Namespace重合。所以,当你在断点时,你可以输入你的观察窗口: myCustomCollection.ToStringExtended()
并将输出复制到任何地方
答案 3 :(得分:1)
您也可以在立即窗口中调用方法,因此我认为您最好的选择是使用ObjectDumper对象,如the one in the LINQ samples或this one,然后在立即写入类似的内容窗口:
File.WriteAllText(“myFileName.txt”,ObjectDumper.Dump(addressGraph));
根据您决定使用的ObjectDumper,您可以根据自己的需要对其进行自定义,并能够告诉它在转储对象时需要深入多少层次。
更新:您已在评论中澄清了您要将数据保存到文件的原因,以便您可以搜索它,并在不同的时间点在执行或程序的不同运行。我实际上写了一个Visual Studio的商业扩展(称为BugAid)。有了它,您可以take snapshots of variables(通过右键单击它们并选择“保存变量”),然后在变量和之前保存的值的快照之间进行差异处理。集合中每个项目的先前值和当前值与diff工具一样并排显示,您可以在比较数据时search通过。
注1:目前无法将快照保存到文件中,只能在同一个调试会话中进行比较。
注意2:在当前版本的BugAid中,搜索和保存快照最多只能处理对象图的3个级别。在下一个版本中,您将能够控制搜索/保存数据的深度。
如果这对你有帮助,请告诉我。
答案 4 :(得分:1)
在Visual studio Gallery上搜索:对象导出扩展。
请注意:就我工作而言,它有一个阻止您偶尔导出对象的错误。
答案 5 :(得分:0)
这是一个处理集合的解决方案。它是一个VS可视化工具,它将在调试时显示网格中的集合值,并保存到剪贴板和csv,xml和文本文件。我在VS2010 Ultimate中使用它。虽然我没有对它进行过广泛的测试,但我已经在列表和词典上进行了测试。
它处理以下集合:
•System.Collections classes
◦System.Collections.ArrayList
◦System.Collections.BitArray
◦System.Collections.HashTable
◦System.Collections.Queue
◦System.Collections.SortedList
◦System.Collections.Stack
◦All classes derived from System.Collections.CollectionBase
•System.Collections.Specialized classes
◦System.Collections.Specialized.HybridDictionary
◦System.Collections.Specialized.ListDictionary
◦System.Collections.Specialized.NameValueCollection
◦System.Collections.Specialized.OrderedDictionary
◦System.Collections.Specialized.StringCollection
◦System.Collections.Specialized.StringDictionary
◦All classes derived from System.Collections.Specialized.NameObjectCollectionBase
•System.Collections.Generic classes
◦System.Collections.Generic.Dictionary
◦System.Collections.Generic.List
◦System.Collections.Generic.LinkedList
◦System.Collections.Generic.Queue
◦System.Collections.Generic.SortedDictionary
◦System.Collections.Generic.SortedList
◦System.Collections.Generic.Stack
•IIS classes, as used by
◦System.Web.HttpRequest.Cookies
◦System.Web.HttpRequest.Files
◦System.Web.HttpRequest.Form
◦System.Web.HttpRequest.Headers
◦System.Web.HttpRequest.Params
◦System.Web.HttpRequest.QueryString
◦System.Web.HttpRequest.ServerVariables
◦System.Web.HttpResponse.Cookies
以及一些与VB6兼容的集合
答案 6 :(得分:0)
在“立即窗口”中打印以下内容以获取二进制转储:
byte[] myArray = { 02,01,81,00,05,F6,05,02,01,01,00,BA };
myArray
.Select(b => string.Format("{0:X2}", b))
.Aggregate((s1, s2) => s1 + s2)
这将打印如下内容:
0201810005F60502010100BA
更改'.Aggregate(...)'调用以在字节之间添加空格,或者你喜欢什么。