这可能看起来很奇怪,但忽略了这一点,是否有一种将List转换为Dictionary的简洁方法,其中Dictionary中的每个键值对只是List中的每个字符串.即
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
Run Code Online (Sandbox Code Playgroud)
我已经做了大量的搜索,并且在Stackoverflow上有几十个例子就是在相反的方向上进行,但不是这样.
这样做的原因是我有两个第三部分组件,更改它们不在我手中.一个将电子邮件地址列表作为List返回,另一个发送To参数为Dictionary的电子邮件.字典的关键是电子邮件地址,值是他们的真实姓名.但是,我不知道真实姓名,但如果您将真实姓名设置为电子邮件地址,它仍然有效.因此,我想将List转换为Dictionary.有很多方法可以做到这一点.列表中的foreach循环,它将kvp添加到字典中.但我喜欢简洁的代码,并想知道是否有单行解决方案.
我有一个非常古老但非常大的库,我正在考虑转换为C#类库.现有库使用存储在TLS中的许多全局变量.C#没有真正的全局变量概念,但是一个解决方法是使用一个名为GlobalVar的静态类,并将它们全部放在这个类中,以便可以通过GlobalVar.xxxxxx访问它们
但是,我的想法是,这会破坏所有正在转换的现有代码,因为GlobalVar类将是一个普通的全局类,而不是每个线程存储.有没有办法让这些全局变量成为每个线程?即C#中__declspec(thread)静态的等价物是什么?
在这一点上我应该补充一点,我讨厌全局变量.我认为它们往往是设计不佳的结果.但是,由于严格的时间限制,第一阶段是将库转换为C#,而不是大惊小怪,然后第二阶段将正确地重新设计它们.
在C++中是否有一种方法可以编写一个具体的类,当另一个类派生它时,它有一个必须重写的方法.抽象类允许强制派生类创建任何抽象方法的具体版本,但我想要的是一个强制执行此操作的基类,但也可以单独使用它.我知道抽象方法也可以指定默认功能,但这仍然是一个无法实例化的抽象类.
我也查看了模板方法模式,但这似乎并不是我正在寻找的.
我正在尝试编写一个驻留在Windows服务中的WCF服务.此WCF服务只会将字符串添加到列表中,然后工作线程将定期处理此列表.实现这一目标的最佳方法是什么?我读过令人困惑的相互矛盾的例子.服务和线程共享列表对象的最佳方式是什么?
更新:感谢您的回复.只是为了澄清,我并没有在列表的同步或如何使其线程安全方面苦苦挣扎.这一切似乎与我在C++中习惯的原理相同.我正在努力的是在哪里定义这个列表,以便可以从WCF服务和工作线程访问它.在C++中,我会在全局范围内创建列表,但C#没有全局范围.如果我在WCF服务类中定义它,则线程无法看到它.如果我在服务类中定义它(定义并启动了线程函数),则WCF服务无法看到它.我确信我前段时间在ATL做过类似的事情,但是周五下午,灰色的细胞已经放弃了.
Update2:我应该在哪里定义工作线程?在Windows服务类(即主机)或WCF服务中?WCF服务应该是具有列表成员和线程功能的单例服务吗?这解决了访问问题.做了很多COM后,我想把WCF服务当作一个COM组件,实例在访问后就会死掉.这使我想要将静态列表和线程函数放在Windows服务类中.这仍然是感觉更自然的地方,但也许我只是没有用.NET方式思考.
我已经阅读了其他类似的问题,但他们没有解决这个特殊的问题.我有一个带有touppercase功能的旧C库(作为示例).这需要一个char*并返回一个char*.但是,返回的指针是指向同一个字符串的指针(不要问我没写它).
该函数如下所示:
__declspec(dllexport)
char * __cdecl touppercase(char *ps_source)
{
char *ps_buffer = NULL;
assert (ps_source != NULL);
ps_buffer = ps_source;
while (*ps_buffer != '\0')
{
*ps_buffer = toupper(*ps_buffer);
ps_buffer++;
}
*ps_buffer = '\0';
return (ps_source);
}
Run Code Online (Sandbox Code Playgroud)
声明它的C#代码如下所示:
[DllImport("mydll.dll", EntryPoint = "touppercase",
CharSet = CharSet.Ansi, ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
private static extern System.IntPtr touppercase(string postData);
Run Code Online (Sandbox Code Playgroud)
我的应用程序中对此的调用看起来像
string sTest2 = Marshal.PtrToStringAnsi(to_uppercase(sTest));
Run Code Online (Sandbox Code Playgroud)
然而,sTest2最终只是一个随机字符串.
我使用相同的参数向同一个dll添加了一个测试函数,但这会在本地分配内存并复制字符串.这很好用.为什么原始版本现在可以使用?
注意:不能更新dll库本身.
我在SQL Server数据库中有一个表,我想添加一行.主键不是自动增量,我不希望它.但是,在这个场合,我确实希望添加一个具有下一个可用值的行.有一个简单的方法吗?我知道我可以在表中查询最大值然后递增它但是使用EF时有更简单的方法吗?
如果需要单独的查询获取MAX值,您将如何使用LINQ执行此操作?
我使用WSDualHTTPBinding创建了WCF发布/订阅服务.它允许服务器应用程序向其提交错误,然后订阅的所有客户端都将收到错误消息.这有效但过了一段时间它会停止工作,说明可靠的会话出现故障.我花了很长时间研究这个并浪费了太多时间.
我的代码与MSDN上的基于列表的发布订阅示例完全相同.
http://msdn.microsoft.com/en-us/library/ms752254.aspx
考虑到接收消息的顺序并不重要,我认为使用MSMQ会更加可靠.
据我所知,在app.config中替换netMsmqBinding是不够的,因为所有的servicecontracts必须是一种方式,在上面的例子中它们不是.是否可以在MSQM中创建发布/订阅模式,如果是这样的话.我已经看到了一些例子,但是它们很难遵循,并且对于它是否是一种好的方法还没有定论.
我有一个用Visual C++ 6编写的旧应用程序.此应用程序的一部分是将文本绘制到位图中.这在Windows XP上运行正常,但是当在Windows 7上运行相同的代码时,所有文本都在ASCII表中移动一个位置.
例如,"Category"成为"B'sdfnqx".
是什么导致了这个以及如何解决这个问题?
编辑:抱歉,但上面的描述有些不正确.当我在代码中看到DrawText函数时,我认为它是GDI函数.当我进入它时,结果是作者已经创建了自己DrawText正在使用的功能OpenGL.我不知道,OpenGL所以现在已经失控了.它调用glCallLists将文本(存储在a中CString)传递给此函数.
完整的类代码如下.注意:它是DrawText函数中的glCallLists函数导致问题.
OGLFontClass::OGLFontClass()
{
m_id = -1;
}
OGLFontClass::~OGLFontClass()
{
Clear();
}
void OGLFontClass::Clear()
{
if( m_id != -1 )
{
glDeleteLists(m_id,255);
m_id = -1;
}
}
void OGLFontClass::Initialise(CString fontname, int size, HDC hDC)
{
m_HDC = hDC;
m_id = glGenLists(255);
::DeleteObject( m_FONT );
m_FONT = CreateFont( -size, // Height Of Font ( NEW )
0, // Width Of …Run Code Online (Sandbox Code Playgroud) 我有一个函数可以逐行读取 CSV 文件。对于每一行,它将把该行分割成一个向量。执行此操作的代码是
std::stringstream ss(sText);
std::string item;
while(std::getline(ss, item, ','))
{
m_vecFields.push_back(item);
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,除非它读取最后一个值为空的行。例如,
text1,tex2,
Run Code Online (Sandbox Code Playgroud)
我希望它返回一个大小为 3 的向量,其中第三个值只是空。然而,它只是返回一个大小为 2 的向量。我该如何纠正这个问题?
我在WinForms应用程序中创建了一个对话框.这有许多文本框和确定/取消按钮.当用户单击"确定"时,如果所有条目都有效,我只希望关闭对话框.我可以分别使用每个控件的"Validating"事件来了解如何执行此操作.那样就好.但是当控件失去焦点时,这些似乎只会触发.但是,对话框中的空文本框也是无效输入,这意味着用户可能永远不会专注于该控件.我更愿意在单击OK时验证所有控件.
我不知道如何做到这一点.覆盖OK按钮的onclick似乎没有停止关闭窗口的选项.Form IsClosing事件通过设置Cancel = true来完成.但这似乎无法区分是否单击了"确定"或"取消"按钮.显然,如果单击取消按钮,我不关心验证,并希望允许表单关闭.
这样做的最佳方法是什么?]
更新:我已经在我的表单和确定按钮上将CausesValidation设置为true,但是当我单击确定按钮时,我的验证事件不会被触发.我提到这个,因为它被建议作为下面的解决方案.
我现在只是看看这些选项,但我有大量的C库,它们是用Visual Studio 6编写的静态链接.lib.较新的发展,需要在Visual Studio 2010中,将调用这些库来完成,并且已经决定,虽然有调用这些老库,它们应该被更新到Visual Studio 2010作为该转化的一部分可能的解决方案,它是看起来很可能我们不妨将它们转换为OO语言.无论是C++,C++/CLR还是C#都需要讨论.
新的应用程序可能用C#编写,可以调用这些库.
将库转换为最好的是什么?它还需要一个相当简单(即不太耗时)的选项.我认为将它们转换为C#将是太多的工作.非托管C++是最简单的,但C++/CLR会是一个很好的中间地带吗?我在这里想,从C#调用C++/CLR要比非托管C++更容易,因此在这里做更多的工作是值得的
我有一些旧的C代码正在转换为C#.有很多按位运算符,比如这个
const unsigned char N = 0x10;
char C;
.....
if (C & N)
{
.....
}
Run Code Online (Sandbox Code Playgroud)
在C#中,这相当于什么呢?例如,第一行在C#中无效,因为编译器说没有从int到char的转换.在C#中,unsigned也不是有效的运算符.