小编Jon*_*ter的帖子

C#将List <string>转换为Dictionary <string,string>

这可能看起来很奇怪,但忽略了这一点,是否有一种将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# dictionary list

108
推荐指数
3
解决办法
16万
查看次数

C#类库的线程本地存储

我有一个非常古老但非常大的库,我正在考虑转换为C#类库.现有库使用存储在TLS中的许多全局变量.C#没有真正的全局变量概念,但是一个解决方法是使用一个名为GlobalVar的静态类,并将它们全部放在这个类中,以便可以通过GlobalVar.xxxxxx访问它们

但是,我的想法是,这会破坏所有正在转换的现有代码,因为GlobalVar类将是一个普通的全局类,而不是每个线程存储.有没有办法让这些全局变量成为每个线程?即C#中__declspec(thread)静态的等价物是什么?

在这一点上我应该补充一点,我讨厌全局变量.我认为它们往往是设计不佳的结果.但是,由于严格的时间限制,第一阶段是将库转换为C#,而不是大惊小怪,然后第二阶段将正确地重新设计它们.

c# multithreading global-variables

11
推荐指数
1
解决办法
9792
查看次数

具体类中的C++强制方法覆盖

在C++中是否有一种方法可以编写一个具体的类,当另一个类派生它时,它有一个必须重写的方法.抽象类允许强制派生类创建任何抽象方法的具体版本,但我想要的是一个强制执行此操作的基类,但也可以单独使用它.我知道抽象方法也可以指定默认功能,但这仍然是一个无法实例化的抽象类.

我也查看了模板方法模式,但这似乎并不是我正在寻找的.

c++ abstract-class

10
推荐指数
1
解决办法
5789
查看次数

WCF服务与工作线程?

我正在尝试编写一个驻留在Windows服务中的WCF服务.此WCF服务只会将字符串添加到列表中,然后工作线程将定期处理此列表.实现这一目标的最佳方法是什么?我读过令人困惑的相互矛盾的例子.服务和线程共享列表对象的最佳方式是什么?

更新:感谢您的回复.只是为了澄清,我并没有在列表的同步或如何使其线程安全方面苦苦挣扎.这一切似乎与我在C++中习惯的原理相同.我正在努力的是在哪里定义这个列表,以便可以从WCF服务和工作线程访问它.在C++中,我会在全局范围内创建列表,但C#没有全局范围.如果我在WCF服务类中定义它,则线程无法看到它.如果我在服务类中定义它(定义并启动了线程函数),则WCF服务无法看到它.我确信我前段时间在ATL做过类似的事情,但是周五下午,灰色的细胞已经放弃了.

Update2:我应该在哪里定义工作线程?在Windows服务类(即主机)或WCF服务中?WCF服务应该是具有列表成员和线程功能的单例服务吗?这解决了访问问题.做了很多COM后,我想把WCF服务当作一个COM组件,实例在访问后就会死掉.这使我想要将静态列表和线程函数放在Windows服务类中.这仍然是感觉更自然的地方,但也许我只是没有用.NET方式思考.

.net c# wcf multithreading

6
推荐指数
1
解决办法
1万
查看次数

使用带有P/Invoke的char*参数调用C DLL函数

我已经阅读了其他类似的问题,但他们没有解决这个特殊的问题.我有一个带有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库本身.

c# dll pinvoke

5
推荐指数
1
解决办法
3859
查看次数

.NET实体框架使用增量主键添加新行

我在SQL Server数据库中有一个表,我想添加一行.主键不是自动增量,我不希望它.但是,在这个场合,我确实希望添加一个具有下一个可用值的行.有一个简单的方法吗?我知道我可以在表中查询最大值然后递增它但是使用EF时有更简单的方法吗?

如果需要单独的查询获取MAX值,您将如何使用LINQ执行此操作?

.net ado.net entity-framework

5
推荐指数
1
解决办法
2587
查看次数

WCF使用MSMQ发布/订阅

我使用WSDualHTTPBinding创建了WCF发布/订阅服务.它允许服务器应用程序向其提交错误,然后订阅的所有客户端都将收到错误消息.这有效但过了一段时间它会停止工作,说明可靠的会话出现故障.我花了很长时间研究这个并浪费了太多时间.

我的代码与MSDN上的基于列表的发布订阅示例完全相同.

http://msdn.microsoft.com/en-us/library/ms752254.aspx

考虑到接收消息的顺序并不重要,我认为使用MSMQ会更加可靠.

据我所知,在app.config中替换netMsmqBinding是不够的,因为所有的servicecontracts必须是一种方式,在上面的例子中它们不是.是否可以在MSQM中创建发布/订阅模式,如果是这样的话.我已经看到了一些例子,但是它们很难遵循,并且对于它是否是一种好的方法还没有定论.

.net c# wcf msmq publish-subscribe

5
推荐指数
1
解决办法
4226
查看次数

OpenGL glCallLists在Windows 7上绘制不正确的字符

我有一个用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)

c++ opengl windows-7

5
推荐指数
1
解决办法
3293
查看次数

将 csv 文件的一行拆分为 std::vector?

我有一个函数可以逐行读取 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 的向量。我该如何纠正这个问题?

c++ csv vector std

5
推荐指数
1
解决办法
1万
查看次数

验证WinForm中的数据

我在WinForms应用程序中创建了一个对话框.这有许多文本框和确定/取消按钮.当用户单击"确定"时,如果所有条目都有效,我只希望关闭对话框.我可以分别使用每个控件的"Validating"事件来了解如何执行此操作.那样就好.但是当控件失去焦点时,这些似乎只会触发.但是,对话框中的空文本框也是无效输入,这意味着用户可能永远不会专注于该控件.我更愿意在单击OK时验证所有控件.

我不知道如何做到这一点.覆盖OK按钮的onclick似乎没有停止关闭窗口的选项.Form IsClosing事件通过设置Cancel = true来完成.但这似乎无法区分是否单击了"确定"或"取消"按钮.显然,如果单击取消按钮,我不关心验证,并希望允许表单关闭.

这样做的最佳方法是什么?]

更新:我已经在我的表单和确定按钮上将CausesValidation设置为true,但是当我单击确定按钮时,我的验证事件不会被触发.我提到这个,因为它被建议作为下面的解决方案.

.net c# winforms

4
推荐指数
1
解决办法
7296
查看次数

将Visual Studio 6库转换为Visual Studio 10

我现在只是看看这些选项,但我有大量的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# c++ visual-studio-2010

3
推荐指数
1
解决办法
166
查看次数

C#位运算符在char上

我有一些旧的C代码正在转换为C#.有很多按位运算符,比如这个

const unsigned char N = 0x10;
char C;
.....
if (C & N)
{
   .....
}
Run Code Online (Sandbox Code Playgroud)

在C#中,这相当于什么呢?例如,第一行在C#中无效,因为编译器说没有从int到char的转换.在C#中,unsigned也不是有效的运算符.

c# bit-manipulation char

1
推荐指数
1
解决办法
2153
查看次数