我的任务很简单 - 我只需要解析这样的文件:
Apple = 1
Orange = 2
XYZ = 3950
Run Code Online (Sandbox Code Playgroud)
但我不知道可用密钥的集合.我使用C#解析这个文件比较容易,让我演示源代码:
public static Dictionary<string, string> ReadParametersFromFile(string path)
{
string[] linesDirty = File.ReadAllLines(path);
string[] lines = linesDirty.Where(
str => !String.IsNullOrWhiteSpace(str) && !str.StartsWith("//")).ToArray();
var dict = lines.Select(s => s.Split(new char[] { '=' }))
.ToDictionary(s => s[0].Trim(), s => s[1].Trim());
return dict;
}
Run Code Online (Sandbox Code Playgroud)
现在我只需要使用c ++做同样的事情.我想要使用,boost::property_tree::ptree但似乎我不能迭代ini文件.它很容易阅读ini文件:
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini(path, pt);
Run Code Online (Sandbox Code Playgroud)
但是不可能迭代它,参考这个问题Boost程序选项 - 获取部分中的所有条目
问题是 - 在C++上编写C#代码模拟的最简单方法是什么?
在C#我喜欢的TryGetValue方法,Dictionary因为它允许我在一个调用中确定字典是否包含键和接收值,如果是这样:
Instrument instrument;
if (isinId2Instrument.TryGetValue(isin_id, out instrument))
{
// key exist, instrument contains value
} else {
// key doesn't exist
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做同样的事情boost::unordered_map?
我需要在两个进程之间传输金融数据(目前c ++和c#,未来的c ++和c ++在Linux上).这是现场报价 - 例如1 100,1 100.1,2 101.2等等.).数据具有明确定义的格式.延迟必须很低.我在zeromq和自己使用共享内存之间做出选择.我有几个关于zeromq的问题:
我不需要在不同的主机上运行我的部件或类似的东西.所以我在localhost上有一个生产者 - 一个消费者模式.我只是不确定我是否应该使用zeromq这样简单的场景,或者我应该只使用共享内存,就是这样吗?
我有这样的代码:
boost::optional<double> result = _ind1.Value() / _ind2.Value();
Run Code Online (Sandbox Code Playgroud)
每个arg boost::optional<double>也是:
boost::optional<double> Value() {
return value;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
Error 1 error C2676: binary '/' : 'boost::optional<T>' does not define this operator or a conversion to a type acceptable to the predefined operator
2 IntelliSense: no operator "/" matches these operands
operand types are: boost::optional<double> / boost::optional<double>
我明白分裂似乎没有定义.我希望结果是boost::none两个参数中的任何一个none- 否则我希望它是正常的双重除法.我应该自己写吗?
在这个示例程序中,我发现了这个注释:
/* Hardware delivers at most ef_vi_receive_buffer_len() bytes to each
* buffer (default 1792), and for best performance buffers should be
* aligned on a 64-byte boundary. Also, RX DMA will not cross a 4K
* boundary. The I/O address space may be discontiguous at 4K boundaries.
* So easiest thing to do is to make buffers always be 2K in size.
*/
#define PKT_BUF_SIZE 2048
Run Code Online (Sandbox Code Playgroud)
我很感兴趣为什么for best performance buffers should be aligned on a 64-byte boundary …
有std::atomic<int>怎样才能自动加载值并重置为0?所以,如果我从两个线程执行此操作,只有一个接收值,另一个应该接收0.
当我在C#s1 == s2中写入时,两者都声明为字符串,编译器会比较引用或内容吗?即如果==是为string班级重写?
我只是想知道为什么这段代码打印"true":
string s1 = "hello"
string s2 = s1 + " ";
s2 = s2.Trim(); // i expect new object here
Console.WriteLine(s2 == s1);
Run Code Online (Sandbox Code Playgroud)
此外,我还有一些第三方来源,==通常用于字符串比较.这让我很疯狂,因为我几乎从不==用来比较Java中的字符串,现在我无法理解这段代码是如何工作的.
==用于比较C#中的字符串是否正常?
upd:多亏了所有,几乎所有答案都是正确的.总结:
此行为与Java不同,其中String类的"=="比较引用.
另请参阅为什么字符串不能比较引用?
在我个人看来语言不应该允许覆盖或重载==运算符,因为它使它像c ++一样困难:)
我非常喜欢Eclipse Ctrl+ O+ Ohotkey,它不仅包括当前类的成员列表,还包括所有超类的所有成员."Quick type hiererchy"功能也很有用.Resharper有Alt+ End和Alt+ Home键,但它不会在树中组织结果非常方便.
是否有可能在VS中获得提及的功能?
我正在使用JOptionPane.showMessageDialog(和showConfirmDialog其他方法)这个方法的问题 - 它不格式化文本.如果我传递了很长的消息 - 它将在一行中显示(可能比屏幕分辨率更宽).当然我可以\n在消息中使用,但这对我来说是额外的工作.
我想要一个对话框,它会自动为我格式化文本.
我有"做很多工作"的命令行程序,并产生"很多统计数据".这是股票交易软件对延迟,错误等等至关重要,所以我不想为它添加GUI.(有时需要GUI,但应始终启动控制台应用程序)
我需要GUI来友好地显示收集的统计信息(在只读模式下).如何转移统计数据?每秒刷新它就足够了.我需要将一堆数据从一个控制台c#程序转移到另一个GUI(可能不是c#)程序,将来可能是通过网络,但现在在本地.
统计数据就像"传感器数据",每秒测量一次.有很多(数百个)传感器.(实际上,它有很多不同的值,比如"利润","每秒订单数"等)
我应该使用普通文件,数据库还是其他方式以及如何使用?