我想要一个将字符串映射到不同类型的通用列表的Dictionary.即以下列形式:
Key Value string List<T> string List<U> string List<V> string List<U> ...
目前我正在使用a Dictionary<string, IList>
然后从每个字典KeyValuePair<string, IList> pair
条目中提取强类型列表,如下所示:
Type layerType = pair.Value.GetType().GetGenericArguments()[0];
List<layerType> objectsClicked = pair.Value as List<layerType>;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
[编辑]正如已经注意到的,上面的内容没有编译,道歉 - 这就是当你在做某些事情的时候提出问题时所得到的.更多解释.我正在制作一个基本的空间数据查看器.最终视图由一组Layer<T>
s组成.每个图层都提供一个委托来呈现其类型(给定偏移量和比例)以及检查其对象在当前窗口中的方式.对于命中测试,我希望每个图层的列表都被击中了对象.这份名单将是List<Point>
一个Point
层,等等......从所有命中的分组Layer<T>
s就那么是强类型列表的集合.
过去我们遇到过一个问题,即流氓进程阻止了sqlite数据库.我已经写了一些代码来通知我们是否发生这种情况,但需要对其进行测试.
我怎么能故意锁定一个sqlite数据库,以便我可以检查一下我是否可以检查它是否被锁定了?
以下代码将永远冻结.
public async Task DoSomethingAsync()
{
await Task.Delay(2000);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DoSomethingAsync().Wait();
// Task.Delay(2000).Wait();
}
Run Code Online (Sandbox Code Playgroud)
如果我DoSomethingAsync
使用注释掉的代码切换调用,它的行为与预期一致.我怀疑嵌套等待导致死锁,但我不知道为什么,或者如何解决它.
我经常将列表暴露为ReadOnlyCollection<T>
s,即
public class Class
{
List<string> list;
public ReadOnlyCollection<string> TheList
{
get { return list.AsReadOnly(); }
}
}
Run Code Online (Sandbox Code Playgroud)
什么是一个做到这一点的最好办法IDictionary<T,U>
,如SortedList<string, string>
?
我正在尝试创建一个类,在创建时,启动一个后台线程,类似于下面的:
class Test
{
boost::thread thread_;
void Process()
{
...
}
public:
Test()
{
thread_ = boost::thread(Process);
}
}
Run Code Online (Sandbox Code Playgroud)
我无法编译,错误是"没有匹配函数调用boost :: thread :: thread(未解析的函数类型)".当我在课外做这件事时,它运作正常.如何让函数指针起作用?
我正在使用System.Diagnostics.TraceSource进行日志记录,我的一个侦听器是TextWriterTraceListener.在跟踪引物中,它将其设置如下:
<listeners>
<add initializeData="output.txt"
type="System.Diagnostics.TextWriterTraceListener"
name="myLocalListener" />
</listeners>
Run Code Online (Sandbox Code Playgroud)
问题是这将始终附加到output.txt.如何在配置文件中将其更改为覆盖?
以编程方式我想要的听众是:
new TextWriterTraceListener(new StreamWriter("output.txt", false));
Run Code Online (Sandbox Code Playgroud) 我目前正在研究一种通过方程组合多个数据流的应用程序.我希望能做的是:
var result = (stream1 + stream2) / stream3 + stream4 * 2;
Run Code Online (Sandbox Code Playgroud)
当result
更新,只要任何流的更新.目前,我在Rx中表达这一点的唯一方法是:
var result = stream1.CombineLatest(stream2, (x,y) => x+y)
.CombineLatest(stream3, (x,y) => x / y)
.CombineLatest(stream4, (x,y) => x + y*2);
Run Code Online (Sandbox Code Playgroud)
这几乎不是那么清楚.
我目前的想法如下:
Public class ArithmeticStream : IObservable<double>
{
public static ArithmeticStream operator +(ArithmeticStream xx, ArithmeticStream yy)
{
return Observable.CombineLatest(xx,yy, (x,y) => x + y);
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是CombineLatest返回一个IObservable<double>
而不是ArithmeticStream.
两个可能的问题:
如何透明地将其IObservable<double>
转换为ArithmeticStream?
有没有一条替代路线可以让我得到我想要的结果?
我正在尝试在protobuf消息列表的开头插入一个项目.add_foo
将项目追加到结尾.有一种简单的方法可以在开头插入它吗?
我们一直在使用协议缓冲区,并使用protoc生成c ++和python文件,使用protobuf-csharp-port生成c#文件.目前这些是单独完成的,来自linux的c ++和python以及来自windows的c#.我们希望有一个脚本生成所有这些,在linux中运行.
要做到这一点,我试图用单声道运行ProtoGen.exe,但它不会产生任何输出.运行以下命令,但不生成cs文件,也没有错误.
mono ../cs/Packages/Google.ProtocolBuffers/tools/ProtoGen.exe --protoc_dir=/usr/local/bin/ ./subdir/simple_types.proto
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,我错过了一些简单的东西.
我有一个显示自定义数据类型内容的数据网格。
<DataGrid Name="TestGrid" ItemsSource="{Binding Source={StaticResource Data}}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Value 1" Binding="{Binding Value1, StringFormat={}{0:C}}"/>
<DataGridTextColumn Header="Value 2" Binding="{Binding Value2, StringFormat={}{0:#.00}}"/>
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)
我想将不同的命令绑定到每个 DataGridTextColumn 的 MouseLeftButtonDown 和 MouseRightButtonDown 事件。我可以使用 DataGridTemplateColumn 的 CellEditingTemplate 对输入进行一些自定义,但无法弄清楚如何获得我想要的行为。
编辑:我的目标是左键单击增加值,右键单击减少值,+/- 的大小会因列而异。
编辑2:似乎您可以使用触发器根据鼠标事件更改样式,但这似乎不适用于更改数据本身。我倾向于放弃数据网格并使用 ListView
c# ×7
c++ ×2
.net ×1
app-config ×1
async-await ×1
boost-thread ×1
datagrid ×1
delay ×1
dictionary ×1
linux ×1
list ×1
logging ×1
mono ×1
mouseevent ×1
sortedlist ×1
sqlite ×1
tracesource ×1
wpf ×1