如何在 LinqPad 中转储最新列表?

How to Dump latest list in 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 here 但它对我不起作用。

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(),正如 Joe 在评论中提到的那样。如果您使用第一种方法,请将列表本身放在 DumpContainer 中,然后在循环中对其调用 Refresh()

的回答基本相同,略短。

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