如何在Visual Studio的即时窗口中运行foreach循环?

17

我正在尝试使用Visual Studio 2017中的立即窗口将值写入文件。

我有一个名为_myItems的变量,它是Dictionary<int,Dictionary<int,List<int>>>类型。

我遇到了一个断点,在这个变量的作用域内。我可以运行

?_myItems
在窗口中,我会得到一个列表,例如:
Count = 9
    [0]: {[536], System.Collections.Generic.Dictionary`2[System.Int32,System.Collections.Generic.List`1[System.Int32]]]}
    [1]... omitted for clearance
    ...    omitted for clearance
    ...    omitted for clearance
    [8]... omitted for clearance

为确保我可以在立即窗口中写入文件,我运行了:

File.WriteAllText("test.txt", "testing purposes");

这个文件是由谁写的,因此我确定我可以从那里写入文件。

然后我尝试了以下操作:

?(foreach (KeyValuePair<int, Dictionary<int, List<int>>> pair in _myItems) { foreach (KeyValuePair<int, List<int>> valuePair in pair.Value) { foreach (int numberToWrite in valuePair.Value) { File.AppendAllText("test.txt",numberToWrite.ToString()); } }})
但我遇到了以下错误:

error CS1525: Invalid expression term 'foreach'

通过搜索,我找到了这个问题,但是被接受的答案只说明您可以这样做。

如何在即时窗口中运行此 foreach 循环以将值写入文件。

请注意,我知道我应该在代码内部完成,但我认为我不会再需要这些值。 我只是在检查平均值。当我使用我编写的应用程序时,我决定使用这些值。鉴于准备这些价值需要数小时,没有可能只停止执行并重新编写我需要的内容,然后再次完整过程。

我也知道我可以运行

?_myItems[536][0] 

然后手动复制文件中的值。考虑到有很多列表,这个过程也会花费很长时间,我想避免这种情况。

有没有可能在立即窗口中使其工作?

更新:

我按答案中建议的做了:

_myItems.Select(x => x.Value)
                    .ToList()
                    .ForEach(pair => pair
                                     .ToList()
                                     .ForEach(valuePair => valuePair
                                                           .Value
                                                           .ForEach(numberToWrite => File.AppendAllText("test.txt", numberToWrite.ToString()))))

我遇到了以下错误:

对于方法System.Collections.Generic.List`1[System.Collections.Generic.Dictionary`2[System.Int32,System.Collections.Generic.List`1[System.Int32]]].ForEach()的评估调用了本地方法Microsoft.Win32.Win32Native.GetFullPathName()。在此上下文中评估本机方法是不受支持的。

我甚至尝试只是像这样Debug.Print输出我的值,例如:

_myItems.ToList().ForEach(pair => System.Diagnostics.Debug.Print(pair.Key));

结果我遇到了同样的错误。这次是调用本地方法时出错:

System.Diagnostics.Debugger.IsLogging()

我搜索了这个错误,并根据这篇答案,建议从调试选项中勾选使用托管兼容模式。然而,在我的情况下,由于我已经处于调试会话中,所以此选项被禁用。


请注意,在即时窗口中不需要使用“?”前缀。 - Polyfun
2个回答

4

Dictionary<TKey, TValue> 类型没有 .ForEach 方法,只有 List<T> 类型才有。

您可以选择字典的值,将其转换为列表,并遍历每个值并将其写入文件。

补充一下 Helio Santos 的回答:

_myItems.Select(x => x.Value).ToList().ForEach(pair => pair.ForEach(intList => intList.ForEach(numberToWrite => File.AppendAllText("test.txt", numberToWrite.ToString()))));

谢谢您的建议。我已经更新了我的问题,并附上了一个错误信息。 - Paul Karam

0

你可以将你的foreach循环转换为一个linq表达式:

_myItems.Select(x => x.Value).ToList().ForEach(pair => pair.ForEach(intList => intList.ForEach(numberToWrite => File.AppendAllText("test.txt", numberToWrite.ToString()))));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接