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

时间:2015-07-23 23:13:29

标签: task-parallel-library system.reactive linqpad concurrent-collections

因此,以下代码将每秒转储整个列表。

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

但是如何在不添加新输出的情况下更新转储输出呢?

有一个相关的问答here,但它对我不起作用。

2 个答案:

答案 0 :(得分:6)

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);
}
编辑:好的,我以为你只想看到最后一项。要打印整个列表,只需使用Joe在评论中提到的subject.Dump()。如果您使用第一种方法,请将列表本身放在DumpContainer中,然后在循环中调用Refresh()

答案 1 :(得分:1)

基本上与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