How can I run a foreach loop in the immediate window of visual studio?
Asked Answered
G

2

18

I am trying to write values to a file using the Immediate Window in Visual Studio 2017.

I've got a variable called _myItems which is of type Dictionary<int, Dictionary<int, List<int>>>.

I did hit a breakpoint where this variable is in scope. I can run

?_myItems

in the window, and I'll get a list like:

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

To make sure that I can write a file in the immediate window, I ran:

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

Which did write the file, therefore I am sure I can write to a file from there.

I then tried the following:

?(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()); } }})

But I am getting the following error:

error CS1525: Invalid expression term 'foreach'

By searching around I came across this question but the accepted answer only state that you can do it.

How can I run this foreach loop in the Immediate Window to write the values to the file.

Note that I am aware that I should've done that inside my code, but I didn't think that I'll need the values later on. I was just checking the average. When I finished using the application I wrote, I decided to use those values. Given the time of preparing the values takes hours and hours, there's no possibility of just stopping the execution and re-write what I need in my code and go through the whole process again.

I am also aware that I can run

?_myItems[536][0] 

Then copying the values manually in the file. This process will also take a long time giving there's a lot of lists, and I would like to avoid it.

Is there any possibility to make this work in the immediate window?

Update:

I did as suggested in the answers:

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

I got the following error:

Evaluation of method System.Collections.Generic.List`1[System.Collections.Generic.Dictionary`2[System.Int32,System.Collections.Generic.List`1[System.Int32]]].ForEach() calls into native method Microsoft.Win32.Win32Native.GetFullPathName(). Evaluation of native methods in this context is not supported.

I even tried to just Debug.Print my values, for example like:

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

And I ended up getting the same error above. This time with the error of calling the native method:

System.Diagnostics.Debugger.IsLogging()

I searched for this error and according to this answer it's suggested to tick the Use Managed Compatibility Mode from debugging options. However, this option is grayed out in my case since I am already in a debugging session I assume.

Guadalupe answered 16/11, 2018 at 13:48 Comment(1)
Note, you don't need to use the ? prefix in the Immediate window.Rentsch
H
4

As .ForEach does not exist on the Dictionary<TKey, TValue> type it only exists on the List<T> class.

Alternatively you can select the values of the dictionary, convert it into a list and walk through every value and write it into the file.

Adding to Helio Santos I would like to add:

_myItems.Select(x => x.Value).ToList().ForEach(pair => pair.ForEach(intList => intList.ForEach(numberToWrite => File.AppendAllText("test.txt", numberToWrite.ToString()))));
Hamil answered 16/11, 2018 at 14:41 Comment(1)
Thank you for your suggestion. I updated my question with an error that I got.Guadalupe
T
0

you can convert your foreach chain to a linq expression:

_myItems.Select(x => x.Value).ToList().ForEach(pair => pair.ForEach(intList => intList.ForEach(numberToWrite => File.AppendAllText("test.txt", numberToWrite.ToString()))));
Tetherball answered 16/11, 2018 at 14:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.