Как сбросить последний список в LinqPad?

Таким образом, следующий код будет делать дамп всего списка каждую секунду.

var list = new List<object>();

for (int i = 0; i < 100; i++)
{
    list.Add(new { A = i.ToString(), B = new Random().Next() });
    list.Dump(); // How to DumpLatest()?
    Thread.Sleep(1000);
}

Но как я могу просто обновить вывод дампа, не добавляя новый?

Существует связанный Q/A здесь, но он не работает для меня.


person orad    schedule 23.07.2015    source источник
comment
Вы знаете, что вызов new Random().Next() в тесном цикле, скорее всего, будет использовать одно и то же начальное число для всех случайных значений (и даст вам поток с одним и тем же числом)? Поэтому у тебя есть Thread.Sleep(1000)?   -  person Enigmativity    schedule 24.07.2015
comment
Хорошо знать. Здесь я просто хотел иметь какое-то значение, может быть пустая строка или что-то еще для этого вопроса.   -  person orad    schedule 24.07.2015


Ответы (2)


Метод расширения DumpLatest() применяется только к IObservable<T>; невозможно обнаружить, что элемент добавлен к List<T>, поэтому LinqPad не может отобразить последнее добавленное значение.

Вместо этого вы можете использовать DumpContainer и явно изменить его содержимое:

var list = new List<object>();

var container = new DumpContainer();
container.Dump();

for (int i = 0; i < 100; i++)
{
    var item = new { A = i.ToString(), B = new Random().Next() };
    list.Add(item);
    container.Content = item;
    Thread.Sleep(1000);
}

Вы также можете добиться того же результата с помощью Subject<T> (возможно, более элегантного):

var subject = new Subject<object>();
subject.DumpLatest();

for (int i = 0; i < 100; i++)
{
    var item = new { A = i.ToString(), B = new Random().Next() };
    subject.OnNext(item);
    Thread.Sleep(1000);
}

РЕДАКТИРОВАТЬ: ОК, я думал, вы хотите увидеть только последний элемент. Чтобы распечатать весь список, просто используйте subject.Dump(), как упоминал Джо в комментариях. Если вы используете первый подход, поместите сам список в DumpContainer и вызовите Refresh() для него в цикле.

person Thomas Levesque    schedule 24.07.2015
comment
Отлично, но это выводит только последний элемент, а не обновленный список. Я мог получить то, что мне было нужно, выполнив следующие действия: list.Add(item); subject.OnNext(list.ToArray()); - person orad; 24.07.2015
comment
Если вы возьмете второе решение Томаса и замените .DumpLatest() на .Dump(), даст ли оно вам то, что вы хотите? - person Joe Albahari; 24.07.2015
comment
@joe-albahari Да, круто! Именно то, что я хотел. - person orad; 24.07.2015

В основном то же самое с ответом Thomas Levesque, немного короче.

Observable.Interval(TimeSpan.FromSeconds(1))
.Select(t=> new { A = t.ToString(), B = new Random().Next() })
.Take(100)
.Dump(); // all 100 
//.DumpLatest(); //only latest one
person Rm558    schedule 16.11.2015